【发布时间】:2014-04-14 19:28:15
【问题描述】:
使用 libpqxx,是否可以让一个 execs 但尚未被 committed 的准备好的语句将结果存储在 result 中以供以后准备好的语句中使用?
如果是这样,如何做到这一点?
代码
为了便于阅读,我已经对其进行了精简,但这基本上是我想要做的:
void prepare_write_parent_table(connection_base &c){
try
{
c.prepare("write_parent_table",
"INSERT INTO parent_table (column_1) "
"SELECT $1 "
"RETURNING id"
)
("character", pqxx::prepare::treat_string);
}
catch (const exception &e)
{
cerr << e.what() << endl;
}
}
string write_parent_table(transaction_base &t, string data){
try
{
result parent_table_result = t.prepared("write_parent_table")(data).exec();
return parent_table_result[0][0].c_str();
}
catch (const exception &e)
{
cerr << e.what() << endl;
return "";
}
}
void prepare_write_child_table(connection_base &c){
try
{
c.prepare("write_child_table",
"INSERT INTO child_table (parent_table_id, column_a) "
"SELECT $1, $2 "
)
("character", pqxx::prepare::treat_string)
("character", pqxx::prepare::treat_string);
}
catch (const exception &e)
{
cerr << e.what() << endl;
}
}
检查来自write_parent_table 的return 以查看if( == "")。如果不是,则继续;否则,我将在那里commit 让它失败,或者如果可能的话最好取消交易;但是,如果可能的话,我还不知道该怎么做。
INSERTs 到 child_table 每 parent_table INSERT 的数量总是不确定的。
【问题讨论】:
-
for (result::size_type i=0; i < Results.size(); ++i) other_prepare_object(Results[i]);pqxx.org/devprojects/libpqxx/doc/3.1/html/Reference/a00076.html -
@CantChooseUsernames 谢谢 CantChooseUsernames!所以您是说可以从尚未提交的
exec返回结果?如果是这样,这是一个了不起的设置! -
我没有亲自尝试过,但值得一试。将该循环粘贴到您的代码中并打印
Results[i]的任何内容,然后查看.. 如果Results.size() > 0那么我说是的。否则没有。 -
只要您准备下一个查询之后将结果保存到表(或临时表)中,同一事务中的所有内容都是可见的.
-
@ErwinBrandstetter 感谢您关注 Erwin Brandstetter!您介意在答案中澄清吗?我正在尝试将父表中的
RETURNINGid用于引用父表的子表列中,方法是将其存储在来自exec的result中。在所有准备好的语句都是execed 之后,我然后commit。你是说事务需要分解,要获得RETURNING值,必须首先是committed?如果是这样,我应该将隔离设置为SERIALIZABLE吗?如果是这样,怎么做?提前非常感谢您!
标签: c++ postgresql prepared-statement libpqxx