pg-promise:在事务中的下一个查询中使用一个查询的结果
pg-promise: use result of one query in next query within a transaction
我 node.js 使用 postgres 的 pg-promise,尝试按顺序执行包含 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>
?
方法 sequence 用于 运行 无限序列,这与您要实现的目标无关 - 标准/琐碎事务:
await db.tx(async t => {
const id = await t.one('INSERT INTO table1(a, b) VALUES(, ) RETURNING id', [1, 2], a => +a.id);
await t.none('INSERT INTO table2(id, a_id) VALUES(, )', [1, id]);
});
我 node.js 使用 postgres 的 pg-promise,尝试按顺序执行包含 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>
?
方法 sequence 用于 运行 无限序列,这与您要实现的目标无关 - 标准/琐碎事务:
await db.tx(async t => {
const id = await t.one('INSERT INTO table1(a, b) VALUES(, ) RETURNING id', [1, 2], a => +a.id);
await t.none('INSERT INTO table2(id, a_id) VALUES(, )', [1, id]);
});