如何将记录插入到nodejs中相互连接的两个表中

时间:2017-04-24 05:31:05

标签: node.js postgresql sql-insert

这可能是一个非常简单的问题,虽然我花了很长时间但仍未能弄明白。我需要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的记录时,至少在运行回调函数时,它还不存在。

您对解决此冲突的建议是什么?

1 个答案:

答案 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();将终止连接“强制”提交......

或者,考虑重写代码以在一个会话中运行两个语句,而不是一个事务......