c++ - 使用 pqxx 在 postgresql 中存储 std::vector 并从数据库中检索它。
问题描述
我需要将 an 的内容存储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 为普通的旧指针,std::vector
构造函数将能够将它们减去以一次性为向量分配正确的大小。
请注意,这确实会复制数据;没有办法从现有内存构造向量,因为向量总是¹拥有它指向的内存。
而不是使用 a std::vector<uint8_t>
,它可能更容易使用std::string
。C++ 中的字符串只是一系列char
s(字节),而不是字符,并且pqxx::binarystring
具有从和到的内置转换std::string
。
¹ Nitpicker 的角落:除非您使用合适的自定义分配器。不建议。
推荐阅读
- ruby-on-rails - Rails 5.2 - 如何将报表模型与两个用户相关联
- android - Revision not found in React-Native,Android
- html5-canvas - 如何为 IText Fabricjs 中的每个项目设置绝对位置
- android - 如何使用 Glide 设置 CollapsingToolbarLayout 背景?
- javascript - 函数构造函数 - 使用原型添加函数给出 - Uncaught SyntaxError: Unexpected token {
- docker - 如何在没有 Internet 和 Intranet yum 存储库的情况下安装 docker-ce?
- keras - How to dynamically select different branches in Keras model, based on the input?
- javascript - 选择选项html内的颜色框
- c# - 问题反序列化条带 json 响应
- c# - 未找到创作者