簡體   English   中英

對數組中的每個對象運行PostgreSQL UPDATE查詢

[英]Run PostgreSQL UPDATE query for every object in array

假設我有一個購物車,每個雜貨都有一個唯一的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。

多謝你們! 還是菜鳥,所以我很難解釋我的需求。

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具有出色的功能 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

如果您使用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多行更新

鏈接:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM