我想用 dynamci params 执行 sql
我可以在pqxx4中找到如下代码
work txn(*conn);
pqxx::result r = txn.prepared("insert into mytable (a,b,c,d,e) values (1,2,$1,$2,$3)")(person_name)(age)(sex).exec();
txn.commit();
但是我用的是7版本的pqxx,代码不支持。
那么如何在pqxx7中使用动态参数执行sql?
using FieldValue = std::variant<int32_t, int64_t, float, double, std::string, bool>
std::string tableName = "mytable";
std::vector<std::string> columNames{"a", "b", "c", "d", "e", ...};
std::vector<FieldValue >{1, "", 2, "", 5L ...};
std::string sql = "INSERT INTO \"" + tableName + "\"(";
for (int i = 0; i < colums.size(); i++)
{
if (i > 0)
{
sql += ", ";
}
sql += colums[i];
}
sql += " ) VALUES ( ";
for (int i = 0; i < colums.size(); i++)
{
if (i > 0)
{
sql += ", ";
}
sql += "$" + std::to_string(i + 1);
}
sql += " )";
pqxx::connection conn{...};
conn.prepare("test", sql);
pqxx::work work(conn);
怎么办?
我认为您要查找的内容位于有关准备好的语句的文档部分(抱歉,没有链接,因为它不断变化)
pqxx::connection conn;
conn.prepare("insert_statement", "insert into mytable(a, b, c, d, e) values (1, 2, $1, $2, $3)");
然后在稍后的某个时刻:
pqxx::transaction txn(conn);
txn.exec_prepared("insert_statement", field_value3, field_value4, field_value5);
如果您要插入字符串,请使用:
txn.esc(field_value)
执行准备好的语句有多种不同的方法,但这与我目前在 libpqxx 7.x 中使用的方法类似。
这有点晚了,但对于现在和将来关注这个问题的人来说。我想现在你会想做这样的事情文档
基本上,您仍然可以在查询字符串中执行
$1 , $2, ...
操作,而不是准备好的语句,然后构建一个 pqxx::params
,然后将其与查询一起传递。
int values[] = {1,2,3};
std::string query = "INSERT into mytable (a, b, c) VALUES ($1, $2, $3);
pqxx::params p;
for (int i = 0; i < num_values; i++) {
p.append(values[i])
}
pqxx::nontransaction ntxn(c);
ntxn.exec(query, p);
并且您的
c
将是您的 pqxx::connection
。
注意:这段代码在语法上可能不完全正确,但这是我认为的总体思路。