代码之家  ›  专栏  ›  技术社区  ›  Lars Nielsen

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

  •  0
  • Lars Nielsen  · 技术社区  · 6 年前

    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() 同样的问题。 有人能帮忙吗,我开始紧张了。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Thomas    6 年前

    pqxx::binarystring::data 不返回指向向量的指针,因此不能像在这里一样将其视为向量:

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

    更确切地说 data() 功能 returns 指向原始数据的指针。要从中构造向量,最简单的方法是使用 pqxx::binarystring ,就像这样:

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

    因为迭代器是typedef'd作为普通的旧指针,所以 std::vector


    而不是使用 std::vector<uint8_t> std::string 相反。C++中的字符串只是一系列 char pqxx::二进制字符串 具有从和到的内置转换


    挑剔的角落:除非你使用一个合适的自定义分配器。不推荐。