2016-09-16 95 views
1

我想从box_property删除当所有更新查询完成与节点和PostgreSQL

我写这篇文章的代码,但我不知道这是正确的还是not.I要运行更新查询同步同步查询

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) {}) 
      } 
     }) 
    }) 
} 

有没有办法运行更新查询同步和后循环我运行删除查询?

这样

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) {}) 

回答

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会做。另一方面,这种变化顺序应该在交易中进行。上面的例子显示了如何同时执行这两个操作。

1

应该避免使任何东西同步的NodeJS。

在你的情况,一个简单的报表要解决的是:

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) {}) 
     }) 
    }) 
+0

这个查询是例如,有没有办法运行查询同步? – ashkufaraz

+0

NodeJS中没有同步查询。如果您需要在N个其他操作完成时执行一个操作,请使用promise或计算回调。 –