与节点和PostgreSQL的同步查询

所有更新查询完成后,我想从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) {}) 

同样的逻辑,用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 }); 

首先,你不需要为这种types的更新做一个循环,一个WHERE IN就可以完成。 而另一方面,这种变化的顺序应该在交易中。 上面的例子向你展示了如何同时做到这一点。

你应该避免在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) {}) }) })