【问题标题】:Run PostgreSQL UPDATE query for every object in array对数组中的每个对象运行 PostgreSQL UPDATE 查询
【发布时间】:2017-12-06 01:21:17
【问题描述】:

假设我有一车杂货,每件商品都有一个唯一的 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

由于我现在有多个商品,我怎样才能让查询针对已购买的每件商品运行?还是作为一个根据购买的商品数量进行调整的大规模查询?

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

谢谢各位!还是个菜鸟,所以我很难解释我需要什么。

【问题讨论】:

  • 您显示一个对象结构,然后显示一个不同的更新结构,就字段名称而言。如果你想得到一个有用的答案,你应该在你的问题中使这两个匹配。否则,你的更新查询逻辑不清楚。

标签: javascript arrays node.js postgresql massivejs


【解决方案1】:

PostgreSQL 有一个excellent feature UPDATE ... FROM ...;,它提供了一种在另一个表上更新一个表的便捷方法。第二个出色的功能 - 您可以在此查询中使用伪表 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

【讨论】:

    【解决方案2】:
    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;";
    }
    

    【讨论】:

    • 这正是我所需要的!我不得不做一些调整,例如,添加一个“else”,这样表中的其他项目就不会受到影响。感谢您的帮助
    【解决方案3】:

    如果您使用的是 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
        });
    

    另请参阅:pg-promise multi-row update

    链接:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      相关资源
      最近更新 更多