这可能是一个非常简单的问题,虽然我花了很长时间但仍未能弄明白。我需要postgresql中的两个表,并在我的nodejs应用程序中动态更新。 table1有两列(obj_id,obj_name),table2有更多列,而包含一列作为" obj_id"作为" fk"参考表1' obj_id&#34 ;; 我试图在table1中插入一条记录,然后进行一些处理并将相应的记录插入table2。我需要" obj_id"从第一个插入返回的值,并将其与其他值一起使用以执行第二个插入。 我试图用以下代码执行此操作,而它总是抛出错误说(在表&#34上插入或更新; table2"违反外键约束" rel_table2_table1" )
function uploadTable1(name,callback){
const client = new pg.Client(conString);
client.connect();
client.on("drain", function () {
client.end();
});
let insertTable1 = client.query(`INSERT INTO table1 (obj_name) VALUES ($1) RETURNING obj_id`, [name]);
insertTable1.on("row", function (row,result) {
callback(row.obj_id);
});
}
function uploadTable2(kk,ff) {
return function (obj_id) {
const client = new pg.Client(conString);
client.connect();
client.on("drain", function () {
client.end();
});
let uploadQuery = client.query("INSERT INTO table2 (kk,ff,obj_id) VALUES ($1,$2, $3)",[kk,ff, obj_id]);
}
}
我可以逐个手动运行这两个函数来插入记录而没有问题,而当它们在主程序中一起运行时如下图所示,我得到了上面提到的错误。
uploadTable1("obj_name1",uploadTable2("kk1","ff1"));
我检查了table1已成功插入并且新记录" obj_id" value已传递给正在执行insert table2的回调函数。虽然奇怪的是他们抛出错误,似乎在抱怨" fk"在插入table2的记录时,至少在运行回调函数时,它还不存在。
您对解决此冲突的建议是什么?
答案 0 :(得分:1)
我假设您在两个函数中进行两个单独的连接。当你尝试uploadTable1
?
uploadTable2("kk1","ff1")
交易
根据此假设,尝试将uploadTable1
更改为:
function uploadTable1(name,callback){
const client = new pg.Client(conString);
client.connect();
client.on("drain", function () {
client.end();
let insertTable1 = client.query(`INSERT INTO table1 (obj_name) VALUES ($1) RETURNING obj_id`, [name]);
insertTable1.on("row", function (row,result) {
callback(row.obj_id);
});
});
有了想法,client.end();
将终止连接“强制”提交......
或者,考虑重写代码以在一个会话中运行两个语句,而不是一个事务......