首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用pqxx在postgresql中存储std::vector并从数据库中检索它。

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

Stack Overflow用户
提问于 2018-10-30 16:17:29
回答 1查看 610关注 0票数 0

我需要将std::vector<uint8_t>的内容存储在postgresql数据库中,以便能够再次将其提取出来。我使用库pqxx作为数据库连接的“包装器”。为了存储,我这样做:

代码语言:javascript
运行
复制
      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();

据我所知,这确实是可行的,并将其存储在数据库中,然后再将该死的向量提取出来。

我试着这样做:

代码语言:javascript
运行
复制
      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时:

代码语言:javascript
运行
复制
      assert(std::equal(data.begin(), data.end(), rdata.begin()));

我得到了一个分段错误,我已经尝试使用rrdata->begin()以及同样的问题。有没有人能帮个忙,我开始有点心烦了。

EN

回答 1

Stack Overflow用户

发布于 2018-10-30 16:27:57

pqxx::binarystring::data不会返回指向向量的指针,所以您不能像这里那样简单地将其视为向量:

代码语言:javascript
运行
复制
          std::vector<uint8_t>*rrdata = (std::vector<uint8_t>*) sblob.data();

相反,data()函数returns一个指向原始数据的指针。要构造一个向量,最简单的方法是使用pqxx::binarystring提供的迭代器,如下所示:

代码语言:javascript
运行
复制
std::vector<uint8_t> rdata(sblob.begin(), sblob.end());

因为迭代器被定义为普通的旧指针,所以std::vector构造函数将能够减去它们,从而一次性地为向量分配正确的大小。

请注意,这确实会复制数据;无法从现有内存构造向量,因为向量始终拥有它所指向的内存。

使用std::string可能更容易,而不是使用std::vector<uint8_t>。C++中的字符串只是一系列的char(字节),而不是字符,并且pqxx::binarystring具有内置的std::string之间的转换。

除非你使用了一个合适的自定义分配器。不推荐使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53059989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档