2017-05-05 34 views
2

我与Postgres的PG-承诺的node.js内,试图做一个交易与2个插入顺序。第一次插入的结果ID应该在事务的下一个插入中使用。PG-承诺:使用一个查询一个查询结果事务

回滚如果任何查询失败。 嵌套第二db.none内的第1 db.one.then()将不会回滚1查询。所以在这里使用交易。

我停留在使用第二个1日查询的结果。 这是我现在拥有的。

db.tx(function (t) { 
    return t.sequence([ 
     // generated using pgp.helpers.insert for singleData query 
     t.one("INSERT INTO table(a, b) VALUES('a', 'b') RETURNING id"), 
     t.none("INSERT INTO another_table(id, a_id) VALUES(1, <above_id>), (2, <above_id>)") 
    ]); 
})... 

第二查询使用pgp.helpers.insert用于多数据查询生成。但是,想要使用以前的查询结果是不可行的。不是吗!

有没有办法让id即从第1 INSERT <above_id>

+0

尚应符合t.one结果对象。它会包含你的ID。等待@ vitay-t解释:) –

+0

为什么使用'batch'如果你想让它们顺序运行? – pozs

+0

@pozs这是一个错误。 t.sequence就是我的意思。编辑了这个问题。 – mythicalcoder

回答

3

方法sequence有运行无穷序列,这什么都没有做与你想什么来实现 - 一个标准/琐碎的事务:

db.tx(t => { 
    return t.one('INSERT INTO table1(a, b) VALUES($1, $2) RETURNING id', [1, 2], x=>+x.id) 
     .then(id => { 
      return t.none('INSERT INTO table2(id, a_id) VALUES($1, $2)', [1, id]); 
     }); 
}) 
    .then(data => { 
     // success, data = null 
    }) 
    .catch(error => { 
     // error 
    }); 
+0

好的,标准交易是最好的选择。现在我可以后'。然后(ID => {'。难道不是吗?我会尝试了这一点创建了'pgp.helpers.insert'二次插入查询。 – mythicalcoder

+0

只是想采取从以前的事务ID和创建多数据插入查询pgp助手。它的工作。谢谢。 – mythicalcoder

相关问题