如何在 sql 查询中使用 c++ 中的 pqxx 为 postgresql 执行 IN?

Posted

技术标签:

【中文标题】如何在 sql 查询中使用 c++ 中的 pqxx 为 postgresql 执行 IN?【英文标题】:How to perform IN in sql query using pqxx in c++ for postgresql? 【发布时间】:2014-05-26 17:34:06 【问题描述】:

如何使用c++中的pqxx for postgresql在sql查询中执行IN? 我有vector<long> 的ID,我需要更新学生表中的每一行(将faculty_id 设置为某个新值)。 我想避免循环,新值 (faculty_id) 当我使用 prepared INSERT 语句插入教员时得到。 是否有可能通过如此可迭代的结构或使用 pqxx 创建 prepared IN 查询?

void prepareChangeFaculty(connection_base &c)
    const std::string sql =
      "UPDATE students SET faculty_id=$2 WHERE id IN $1"; // here is a problem
    c.prepare("change_faculty", sql);

$1 我有需要更新的行的 id 向量

【问题讨论】:

请提供一些代码。 @Alexandros 我添加了一些有问题的代码 【参考方案1】:

为什么不在 C++11 中使用类似的 (How to concatenate a std::string and an int?)

string a="";
for (int k=0;k<myVector.size();k++)
    a += string(myVector[k]);
    if (k<myVector.size()-1)
        a += ",";
    


std::string sql = "UPDATE students SET faculty_id=$2 WHERE id IN (" + a + ")";

【讨论】:

问:“为什么不这样”? A:“因为SQL注入”! (是的,我知道 myVector 中只会有整数;至少,在这次开发迭代中...) @Massa OP 没有说这个应用程序将被除他之外的其他用户使用,那么你在说什么 SQL 注入,当它是他的数据库服务器和他的应用程序时?跨度> 原则上我不做 SQL 注入(如果我能避免的话)。正如我所说,我知道 myVectors 是一个整数向量(很难在这些向量上注入有毒数据)现在。继承代码的人可以将其更改为string 向量或boost::variant 记录,五年后下一个符合相同代码的人将代码放入库并将其链接到 Web 服务并且没有预算来进行适当的代码审查,并且必须尽快推出产品并 BAM!.... 然后让我们以一种让愚蠢的猴子在所有可能的未来都无法 BAM 的方式编写所有代码......哈哈【参考方案2】:

我理解@Massa 的担忧,但是我找不到与@Alexandros 不同的解决方案。

因此,对这个解决方案的一点改进可以是使用 std::copy

std::stringstream params;

std::copy(
    myVector.begin(), myVector.end(),
    std::ostream_iterator<std::string>(params, ","));

std::string sql = "UPDATE students SET faculty_id=$2 WHERE id IN ('"
    + params.str() + "')";

【讨论】:

以上是关于如何在 sql 查询中使用 c++ 中的 pqxx 为 postgresql 执行 IN?的主要内容,如果未能解决你的问题,请参考以下文章

如何在代码块下使用 pqxx 解决这个编译错误

什么是 C++ 中的“查询参数”?

如何在 QT C++ 中从表的列中获取 SQL 中的所有值

如何在一个脚本中使用 R 将 SQL 查询中的数据插入到单独的 SQL 查询中?

如何将 Qt 中的 SQL 查询输出模型分配给 QML 的 TableView?

编译pqxx源码configure时遇到codecs.py LookupError的解决方法