首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行Postgresql函数,该函数接受使用pg承诺的参数数组。

执行Postgresql函数,该函数接受使用pg承诺的参数数组。
EN

Stack Overflow用户
提问于 2020-03-17 04:41:28
回答 1查看 1K关注 0票数 2

我们有这样的postgresql类型:

代码语言:javascript
复制
create type order_input as (
    item text,
    quantity integer);

而postgresql函数是:

代码语言:javascript
复制
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中执行,我们运行:

代码语言:javascript
复制
select insert_into_orders(
    array[
        ('Red Widget', 10), 
        ('Blue Widget', 5)
    ]::order_input[]
);

我正在努力弄清楚如何使用pg-答应javascript库来执行insert_into_orders函数。我试过以下几点:

代码语言:javascript
复制
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}]

但得到以下信息:

代码语言:javascript
复制
{
  "error": {
    "message": "malformed array literal: \"{\"item\":\"Red Widget\", \"quantity\":10}\""
  }
}

如果有人知道我如何为pg-诺言构建我的输入,我会非常感激的,最初的帖子来自于这里:将多条记录插入两个表的Postgres函数

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-17 08:43:58

方法功能需要一个值数组作为第二个参数。在您的情况下,它必须是一个参数数组的对象。但是您却给了它两个参数,每个参数都是一个对象,因此出现了错误。

正确的方法是:

代码语言:javascript
复制
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"}

那是因为类型错配,这需要类型转换.

您可以通过常规查询方法调用函数,也可以使用自定义类型格式修改数据格式:

代码语言:javascript
复制
const data = {
    toPostgres: () => `${pgp.as.array(orderInput)}::json[]::order_input[]`,
    rawType: true
};

然后把它传进去:

代码语言:javascript
复制
await db.func('insert_into_orders', [data]);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60716335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档