对数组中的每个对象运行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多行更新 。
链接:
- 帮手名字空间