簡體   English   中英

使用pqxx在stgre:sql中存儲std :: vector並從數據庫中檢索它。

[英]Storing std::vector in postgresql with pqxx and retrieving it from the database.

我需要將std::vector<uint8_t>的內容存儲在postgresql數據庫中,並能夠再次將其取出。 我將庫pqxx用作數據庫連接的“包裝器”。 為了存儲,我這樣做:

      std::string query = "INSERT INTO file_pivot(file_id, p_id, deviation) VALUES($1, $2, $3) RETURNING id";

      pqxx::binarystring deviation((void*)&(data), data.size());

      conn.prepare("file_insert", query);
      pqxx::result res = worker.prepared("file_insert")(1)(pivot_id)(deviation).exec();

      worker.commit();

據我所知,這確實起作用並將其存儲在數據庫中,然后又把該死的向量取出來。

我試圖做的是這樣的:

      pqxx::work sworker(conn);
      std::string squery = "SELECT * FROM file_pivot WHERE file_id = $1";

      conn.prepare("select_file", squery);
      pqxx::result sres = sworker.prepared("select_file")(file_id).exec();

      std::vector<uint8_t> rdata;
      if(sres.size() > 0)
      {
          pqxx::binarystring sblob(res[0][3]);
          std::vector<uint8_t>*rrdata = (std::vector<uint8_t>*) sblob.data();
          rdata = *rrdata;
      }

但是當我將原始向量datardata進行比較時,如下所示:

      assert(std::equal(data.begin(), data.end(), rdata.begin()));

我遇到了分段錯誤,我嘗試使用rrdata->begin()以及相同的問題。 有人可以幫忙嗎,它開始讓我緊張。

pqxx::binarystring::data不會返回指向矢量的指針,因此您不能像在這里一樣將其視為一個指針:

          std::vector<uint8_t>*rrdata = (std::vector<uint8_t>*) sblob.data();

而是data()函數返回一個指向原始數據的指針。 要構造一個向量,最簡單的方法是使用pqxx::binarystring提供的迭代器,如下所示:

std::vector<uint8_t> rdata(sblob.begin(), sblob.end());

由於迭代器的類型定義為普通的舊指針,因此std::vector構造函數將能夠減去它們,從而一次性為向量分配正確的大小。

注意,這確實會復制數據。 無法從現有內存構造向量,因為向量總是¹擁有它指向的內存。


代替使用std::vector<uint8_t> ,使用std::string可能更容易。 C ++中的字符串只是一系列char (字節),而不是字符,並且pqxx::binarystring具有從std::string到的內置轉換。


¹Nitpicker的角落:除非您使用合適的自定義分配器。 不建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM