【问题标题】:synchronous query with node and PostgreSQL使用节点和 PostgreSQL 同步查询
【发布时间】:2016-09-16 18:20:12
【问题描述】:

我想在所有更新查询完成后从box_property 中删除

我写了这段代码,但我不确定这是否正确。我想同步运行更新查询

var data = [1, 2, 3, 4]; //data generate dynamicly  
for (var i = 0; i < BoxData.length; i++) {
    pool.connect(function(err, client, done) {
        client.query("update   box set gamer_id=null where  box_id=$1; ", [data[i]], function(err, resultUpdate) {
            if ((i + 1) == BoxData.length) {
                //when all query finished then run this query
                client.query("delete from box_property where gamer_id=$1;", [gamer_id], function(err, resultUpdate) {})
            }
        })
    })
}

有没有办法运行更新查询同步并在 for 循环之后运行删除查询?

喜欢这个

var data = [1, 2, 3, 4]; //data generate dynamicly  
for (var i = 0; i < BoxData.length; i++) {
    pool.connect(function(err, client, done) {
        client.query("update   box set gamer_id=null where  box_id=$1; ", [data[i]], function(err, resultUpdate) {
        })
    })
}

//when all query finished then run this query
client.query("delete from box_property where gamer_id=$1;", [gamer_id], function(err, resultUpdate) {})

【问题讨论】:

    标签: node.js postgresql


    【解决方案1】:

    同样的逻辑,以正确的方式实现,pg-promise

    var data = [1, 2, 3, 4]; //data generated dynamically
    
    db.tx(t => {
        return t.none('UPDATE box SET gamer_id = null WHERE box_id IN ($1:csv)', [data])
            .then(() => {
                return t.none('DELETE FROM box_property WHERE gamer_id = $1', [gamer_id]);
            });
    })
        .then(() => {
            // success
        })
        .catch(error => {
            // error
        });
    

    一方面,您不需要为该类型的更新执行循环,单个WHERE IN 就可以了。另一方面,这样的更改序列应该在事务中。上面的示例向您展示了如何同时执行这两项操作。

    【讨论】:

      【解决方案2】:

      您应该避免在 NodeJS 中进行任何同步操作。

      在你的情况下,一个简单的 IN 语句应该可以解决这个问题:

      var params = [];
      for (var i = 1; i <= data.length; i++) {
         params.push("$"+i);
      }
       pool.connect(function(err, client, done) {
          client.query("update box " + 
                       " set gamer_id=null " + 
                       " where  box_id in "+params.join(",")+"; ", 
                       [...data], function(err, resultUpdate) {
              client.query("delete from box_property " + 
                           " where gamer_id=$1;", 
                           [gamer_id], function(err, resultUpdate) {})
              })
          })
      

      【讨论】:

      • 这个查询例如,有没有办法运行查询同步?
      • NodeJS 中没有同步查询。如果您需要在 N 个其他操作完成时执行一项操作,请使用承诺或计数回调。
      猜你喜欢
      • 2013-12-01
      • 1970-01-01
      • 2017-06-30
      • 2015-11-01
      • 2014-02-13
      • 1970-01-01
      • 2017-12-28
      • 2014-08-05
      • 1970-01-01
      相关资源
      最近更新 更多