[英]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;
}
但是當我將原始向量data
與rdata
進行比較時,如下所示:
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.