第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 pg-promise 執(zhí)行接受參數(shù)數(shù)組的 Postgresql 函數(shù)

使用 pg-promise 執(zhí)行接受參數(shù)數(shù)組的 Postgresql 函數(shù)

絕地無雙 2022-05-22 11:30:35
我們有這個 postgresql 類型:create type order_input as (    item text,    quantity integer);而這個 postgresql 函數(shù):create or replace function insert_into_orders(order_input[])returns void language plpgsql as $$declare     inserted_id integer;begin    insert into public.orders(orderdate)     values (now())     returning orderid into inserted_id;    insert into public.orderdetails(orderid, item, quantity)    select inserted_id, item, quantity    from unnest($1);end $$;要在 pgadmin-4 中執(zhí)行,我們運行:select insert_into_orders(    array[        ('Red Widget', 10),         ('Blue Widget', 5)    ]::order_input[]);我試圖弄清楚如何使用 pg-promise javascript 庫執(zhí)行 insert_into_orders 函數(shù)。我嘗試過執(zhí)行以下操作:const pgp = require("pg-promise")();const db = pgp(connectionObj);await db.func("insert_into_orders", [{item:"Red Widget", quantity:10}, {item:"Blue Widget", quantity:5}]但收到以下消息:{  "error": {    "message": "malformed array literal: \"{\"item\":\"Red Widget\", \"quantity\":10}\""  }}如果有人知道我必須如何為 pg-promise 構(gòu)建我的輸入,我將不勝感激
查看完整描述

1 回答

?
慕碼人2483693

TA貢獻1860條經(jīng)驗 獲得超9個贊

方法func需要一個值數(shù)組作為第二個參數(shù)。在您的情況下,它必須是一個參數(shù) - 對象數(shù)組。但是您改為給它 2 個參數(shù),每個參數(shù)都是一個對象,因此會出現(xiàn)錯誤。


正確的方法是:


const orderInput = [{item:"Red Widget", quantity:10}, {item:"Blue Widget", quantity:5}];


await db.func('insert_into_orders', [orderInput]);

無論如何,您應(yīng)該使用事件查詢或pg-monitor來查看生成了什么 SQL。


另外,您insert_into_orders應(yīng)該是一個存儲過程,然后至少通過proc執(zhí)行。但是,它的實現(xiàn)看起來應(yīng)該只是代碼中的一個事務(wù)。


執(zhí)行此操作后,錯誤返回為"error": {"message": "function insert_into_orders(text[]) does not exist"}


那是因為類型不匹配,這需要類型轉(zhuǎn)換......


您可以通過常規(guī)查詢方法調(diào)用該函數(shù),也可以使用自定義類型格式來修改數(shù)據(jù)格式:


const data = {

    toPostgres: () => `${pgp.as.array(orderInput)}::json[]::order_input[]`,

    rawType: true

};

然后將其傳入:


await db.func('insert_into_orders', [data]);


查看完整回答
反對 回復(fù) 2022-05-22
  • 1 回答
  • 0 關(guān)注
  • 85 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號