【问题标题】:pg-promise: use result of one query in next query within a transactionpg-promise:在事务中的下一个查询中使用一个查询的结果
【发布时间】:2017-10-03 12:29:45
【问题描述】:

我是带有 pg-promise for postgres 的 node.js,尝试按顺序执行 2 个插入的事务。第一次插入的结果 id 应该在事务的下一次插入中使用。

如果任何查询失败,则回滚。 在第一个 db.one.then() 内嵌套第二个 db.none 不会回滚第一个查询。所以在这里使用事务。

我被困在第二次使用第一次查询的结果。 这是我现在所拥有的。

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 生成的,用于多数据查询。但是想要使用先前查询的结果是不可行的。不是吗!

有没有办法从第一个 INSERT 中获取 id&lt;above_id&gt;

【问题讨论】:

  • 应该有 t.one 结果的对象。它将包含您的 ID。等待@vitay-t 解释:)
  • 如果您希望它们按顺序运行,为什么要使用batch
  • @pozs 这是一个错误。 t.sequence 就是我的意思。编辑了问题。
  • @Maven 您希望从交易中获得什么数据?

标签: node.js postgresql transactions pg-promise


【解决方案1】:

方法 sequence 可以运行无限序列,这与您要实现的目标无关 - 一个标准/微不足道的事务:

await db.tx(async t => {
    const id = await t.one('INSERT INTO table1(a, b) VALUES($1, $2) RETURNING id', [1, 2], a => +a.id);
    await t.none('INSERT INTO table2(id, a_id) VALUES($1, $2)', [1, id]);
});

【讨论】:

  • 好的,标准交易是要走的路。现在我可以在.then(id =&gt; { 之后使用pgp.helpers.insert 创建第二个插入查询。不是吗?我会试试这个。
  • 只是想从以前的事务中获取 id 并创建 multiData 插入查询 pgp 助手。有效。谢谢。
  • 如何使用async/await 来做同样的事情? var id = await t.one('INSERT... 然后在第二个查询中使用id 是否相当于嵌套事务?
  • 点赞!只是想说你太棒了,任何事情和几乎所有事情都可以在你的 github 问题或这里得到回答
猜你喜欢
  • 1970-01-01
  • 2017-10-14
  • 1970-01-01
  • 2016-06-14
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
相关资源
最近更新 更多