运行 PostgreSQL UPDATE 查询数组中的每个对象
Run PostgreSQL UPDATE query for every object in array
假设我有一车杂货,每件商品都有唯一的 ID。当有人单击 "purchase" 时,将发送一个数组,其中包含该购物车中每个项目的对象。购物车各不相同,因此有时可能是 2 件商品,有时是 6 件商品,等等。
示例:
[{id: 1, amt_purchased: 3}, {id: 2, amt_purchased: 4}]
我需要 SQL table、"grocery items available",根据购买的内容进行更新。
对于一件杂货,我会使用以下内容:
UPDATE available
SET amt_avail = amt_avail - 3
WHERE produce_id = 1
由于我现在有多个项目,我如何才能将已购买的每个项目的查询查询到 运行?或者作为一个大规模查询,根据购买的商品数量进行调整?
我的项目是 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;
您可以使用简单的 for 循环来构建这样的查询
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 有一个 excellent feature UPDATE ... FROM ...;
,它提供了一种在另一个 table 上更新一个 table 的便捷方法。第二个出色的功能 - 您可以在此查询中使用伪 table 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,所以我不太了解直接通过它进行更新。作为 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
});
另请参阅:。
链接:
- helpers 命名空间
假设我有一车杂货,每件商品都有唯一的 ID。当有人单击 "purchase" 时,将发送一个数组,其中包含该购物车中每个项目的对象。购物车各不相同,因此有时可能是 2 件商品,有时是 6 件商品,等等。
示例:
[{id: 1, amt_purchased: 3}, {id: 2, amt_purchased: 4}]
我需要 SQL table、"grocery items available",根据购买的内容进行更新。
对于一件杂货,我会使用以下内容:
UPDATE available
SET amt_avail = amt_avail - 3
WHERE produce_id = 1
由于我现在有多个项目,我如何才能将已购买的每个项目的查询查询到 运行?或者作为一个大规模查询,根据购买的商品数量进行调整?
我的项目是 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;
您可以使用简单的 for 循环来构建这样的查询
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 有一个 excellent feature UPDATE ... FROM ...;
,它提供了一种在另一个 table 上更新一个 table 的便捷方法。第二个出色的功能 - 您可以在此查询中使用伪 table 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,所以我不太了解直接通过它进行更新。作为 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
});
另请参阅:
链接:
- helpers 命名空间