Node.js 在使用事务时,查询中包含的子查询如何在pg promise中工作?

Node.js 在使用事务时,查询中包含的子查询如何在pg promise中工作?,node.js,postgresql,pg-promise,Node.js,Postgresql,Pg Promise,我正在使用pgpromise for node.js,我想确保我正确理解了有关事务的文档 假设我执行了以下事务: db.tx(function(t) { t.any('SELECT * FROM users') .then(function(users) { var queries = []; for (var i =0; i < users.length; i++) { queries.push(t.any("INSERT INTO stocks_ow

我正在使用pgpromise for node.js,我想确保我正确理解了有关事务的文档

假设我执行了以下事务:

db.tx(function(t) {
  t.any('SELECT * FROM users')
  .then(function(users) {
    var queries = [];
    for (var i =0; i < users.length; i++) {
      queries.push(t.any("INSERT INTO stocks_owned (ticker, shares, user_id) VALUES ('GOOG', 10, $1)", users[i].user_id));
    }
    return t.batch(queries);
  })
})
换句话说,其他查询中包含的子查询是否包含在同一个BEGIN/COMMIT块中

这最终会执行哪些postgres查询

您列出的那些,除非没有任何保存点,因为保存点仅用于替代嵌套事务

其他查询中包含的子查询是否包含在同一开始/提交块中


没有子查询,从驱动程序的角度来看,只有查询,在事务中执行的所有查询都将在BEGIN/COMMIT块中

要准确查看pg promise执行的操作,您应该使用,或者至少使用-handle:

以下是代码中的错误:

t.any('SELECT * FROM users')
这应该是:

return t.any('SELECT * FROM users')
或者,这里没有事务逻辑,因为您没有从回调返回任何内容

完成您在那里尝试的任务的最短、最有效的方法:

db.tx(t => {
    return t.map('SELECT * FROM users', [], user => {
        return t.none("INSERT INTO stocks_owned(ticker, shares, user_id) VALUES('GOOG', 10, ${user_id})", user);
    }).then(t.batch);
})
    .then(data => {
        // success, data = [null, null, ...]
    })
    .catch(error => {
        // error
    });
更新

上面的例子不再是最有效的方法。最有效的方法是执行一次选择,然后执行一次多行插入。看

这最终会执行哪些postgres查询

您列出的那些,除非没有任何保存点,因为保存点仅用于替代嵌套事务

其他查询中包含的子查询是否包含在同一开始/提交块中


没有子查询,从驱动程序的角度来看,只有查询,在事务中执行的所有查询都将在BEGIN/COMMIT块中

要准确查看pg promise执行的操作,您应该使用,或者至少使用-handle:

以下是代码中的错误:

t.any('SELECT * FROM users')
这应该是:

return t.any('SELECT * FROM users')
或者,这里没有事务逻辑,因为您没有从回调返回任何内容

完成您在那里尝试的任务的最短、最有效的方法:

db.tx(t => {
    return t.map('SELECT * FROM users', [], user => {
        return t.none("INSERT INTO stocks_owned(ticker, shares, user_id) VALUES('GOOG', 10, ${user_id})", user);
    }).then(t.batch);
})
    .then(data => {
        // success, data = [null, null, ...]
    })
    .catch(error => {
        // error
    });
更新


上面的例子不再是最有效的方法。最有效的方法是执行一次选择,然后执行一次多行插入。请参阅。

谢谢!顺便说一句,你的包装很好,没有淫秽的双关语。干杯。没有子查询这样的事情。嗯,有子查询,但显然不是在节点pg级别。子查询是SQL中的一个构造,其中一个查询包含另一个查询,例如SELECT。。。从…起其中x=选择。。。或者选择。。。从SELECT.@CraigRinger我已经纠正了它,明确地从驱动程序的角度说,因为这就是我们正在讨论的,即对于驱动程序来说,它始终只是一个查询,与它的级别无关。@CraigRinger补充了对代码中错误的解释;还有,谢谢!顺便说一句,你的包装很好,没有淫秽的双关语。干杯。没有子查询这样的事情。嗯,有子查询,但显然不是在节点pg级别。子查询是SQL中的一个构造,其中一个查询包含另一个查询,例如SELECT。。。从…起其中x=选择。。。或者选择。。。从SELECT.@CraigRinger我已经纠正了它,明确地从驱动程序的角度说,因为这就是我们正在讨论的,即对于驱动程序来说,它始终只是一个查询,与它的级别无关。@CraigRinger补充了对代码中错误的解释;另见。