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
即 <above_id>
?
【问题讨论】:
应该有 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 =>
之后使用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:在事务中的下一个查询中使用一个查询的结果的主要内容,如果未能解决你的问题,请参考以下文章