对数组中的每个对象运行PostgreSQL UPDATE查询

比方说,我有一个购物车的购物车,每个项目都有一个唯一的ID。 当有人点击“购买”时,将为该购物车中的每个商品发送一个数组。 车有所不同,所以有时可能是2项,有时6项等。

例:

[{id: 1, amt_purchased: 3}, {id: 2, amt_purchased: 4}] 

我需要我的SQL表,“杂货商品”,根据购买什么来更新。

对于一个杂货项目,我会使用以下内容:

 UPDATE available SET amt_avail = amt_avail - 3 WHERE produce_id = 1 

由于我现在有多个项目,我怎样才能得到所购买的每个项目的查询运行? 或作为一个大量的查询,将根据购买多less项目进行调整?

我的项目是Ionic / AngularJs和NodeJs,Express,MassiveJs。

多谢你们! 还是一个小菜,所以我很难解释我需要什么。

 update available set amt_avail = case when produce_id = 1 then amt_avail - 3 when produce_id = 2 then amt_avail - 4 end; 

你可以使用简单的循环来build立这样的查询

 var items = [{id: 1, amt_purchased: 3}, {id: 2, amt_purchased: 4}]; function buildQuery(items) { var query = "update available set amt_avail = case "; for (var i = 0; i < items.length; i++) { var item = items[i]; query += `when produce_id = ${item['id']} then amt_avail - ${item['amt_purchased']}` } return query += " end;"; 

}

PostgreSQL有一个很好的function UPDATE ... FROM ...; 这可以方便地更新另一个表上的一个表。 第二个出色function – 可以在这个查询中使用伪表VALUES

 UPDATE available a SET amt_available = a.amt_available + v.amt_available FROM ( VALUES (1, 25), (3, 15), (7, -55) -- just pass required values ) AS v (produce_id, amt_available) WHERE a.produce_id=v.produce_id; 

这里有一个SQLFiddle来检查一个想法 – http://sqlfiddle.com/#!17/04f24/22

如果您正在使用Massive.js 3.0,那意味着您可以访问其基础驱动程序pg-promise 。

不幸的是,我没有亲自使用Massive.js,所以我不知道直接通过它进行更新。 我只能build议你作为pg-promise的作者,你可以访问它的驱动来做你想要的更新,如下所示。

 const db; // your Massive.js database object; const helpers = db.pgp.helpers; // pg-promise helpers namespace // reusable ColumnSet: const cs = new helpers.ColumnSet(['?id', 'amt_purchased'], {table: 'available '}); // your input data: const data = [{id: 1, amt_purchased: 3}, {id: 2, amt_purchased: 4}]; // query to be executed: const query = helpers.update(data, cs) + ' WHERE v.id = t.id'; db.instance.none(query) .then(() => { // success, updated all at once }) .catch(error => { // error }); 

另见: pg-promise多行更新 。

链接:

  • 帮手名字空间