pg-promise:在事务中的下一个查询中使用一个查询的结果

Posted

技术标签:

【中文标题】pg-promise:在事务中的下一个查询中使用一个查询的结果【英文标题】:pg-promise: use result of one query in next query within a transaction 【发布时间】: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 您希望从交易中获得什么数据? 【参考方案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 是否相当于嵌套事务? @ezorita github.com/vitaly-t/pg-promise/blob/master/examples/… 点赞!只是想说你太棒了,任何事情和几乎所有事情都可以在你的 github 问题或这里得到回答

以上是关于pg-promise:在事务中的下一个查询中使用一个查询的结果的主要内容,如果未能解决你的问题,请参考以下文章

pg-promise:返回查询结果的正确方法

Postgresql 捕获事务错误和回滚

使用 pg-promise 记录特定的 postgresql 查询

如何使用 pg-promise 帮助器返回插入查询结果值

如何使用pg-promise同时从多个查询中获得结果?

将嵌套循环查询组合到父数组结果 - pg-promise