如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章
如何在一个脚本中使用 R 将 SQL 查询中的数据插入到单独的 SQL 查询中?