使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它



我需要将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());

由于迭代器是 typedef'd 为普通的旧指针,因此std::vector构造函数将能够减去它们以一次性为向量分配正确的大小。

请注意,这确实会创建数据的副本;无法从现有内存构造向量,因为向量始终¹拥有它指向的内存。


与其使用std::vector<uint8_t>,不如使用std::string。C++ 中的字符串只是一系列char(字节),而不是字符,并且pqxx::binarystring具有从std::string到的内置转换。


¹ 吹毛求疵者的角落:除非您使用合适的自定义分配器。不推荐。

相关内容

  • 没有找到相关文章

最新更新