我们有这样的postgresql类型:
create type order_input as (
item text,
quantity integer);而postgresql函数是:
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中执行,我们运行:
select insert_into_orders(
array[
('Red Widget', 10),
('Blue Widget', 5)
]::order_input[]
);我正在努力弄清楚如何使用pg-答应javascript库来执行insert_into_orders函数。我试过以下几点:
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-诺言构建我的输入,我会非常感激的,最初的帖子来自于这里:将多条记录插入两个表的Postgres函数。
发布于 2020-03-17 08:43:58
方法功能需要一个值数组作为第二个参数。在您的情况下,它必须是一个参数数组的对象。但是您却给了它两个参数,每个参数都是一个对象,因此出现了错误。
正确的方法是:
const orderInput = [{item:"Red Widget", quantity:10}, {item:"Blue Widget", quantity:5}];
await db.func('insert_into_orders', [orderInput]);无论如何,您应该使用事件查询或pg-监视器来查看生成了什么SQL。
另外,您的insert_into_orders应该是一个存储过程,然后至少通过流程执行。但是,它的实现看起来应该只是代码中的一个事务。
执行此操作后,错误返回为
"error": {"message": "function insert_into_orders(text[]) does not exist"}
那是因为类型错配,这需要类型转换.
您可以通过常规查询方法调用函数,也可以使用自定义类型格式修改数据格式:
const data = {
toPostgres: () => `${pgp.as.array(orderInput)}::json[]::order_input[]`,
rawType: true
};然后把它传进去:
await db.func('insert_into_orders', [data]);https://stackoverflow.com/questions/60716335
复制相似问题