如何使用 asyncpg API 修复 "syntax error at or near "$1"

How to fix "syntax error at or near "$1" with asyncpg API

我正在尝试通过 asyncpg API 使用查询参数在 postgresql 数据库的 table 中插入值。 我这样创建 table :

CREATE TABLE my_table
(
    cat BIGINT,
    roles BIGINT ARRAY
);

我已经试过像这样直接在 BIGINT 中转换参数::BIGINT 但我得到了同样的错误

await connection.execute('''
        INSERT INTO my_table(cat, roles)
        VALUES(, )
        ON CONFLICT ()
        DO UPDATE SET roles = array_append(roles, )
        ''', cat, roles)

cat 是一个 int,roles 是一个 int 数组

应该将 cat 和 roles 插入 my_table 但我刚收到错误:syntax error at or near ""

我提供数据库的日志以防万一

2019-01-26 21:01:22 UTC:172.31.36.115(37598):Barbote@Barbotedb:[15082]:ERROR: syntax error at or near "" at character 111
2019-01-26 21:01:22 UTC:172.31.36.115(37598):Barbote@Barbotedb:[15082]:STATEMENT: 
INSERT INTO "429792212016955423"(cat, roles)
VALUES( )
ON CONFLICT ()
DO UPDATE SET roles = array_append(roles, );

您需要一个主键(或唯一列)才能使用 ON CONFLICT,因此您必须将 table 定义为

CREATE TABLE my_table
(
    cat BIGINT PRIMARY KEY, -- !!
    roles BIGINT ARRAY
);

roles 列在 UPDATE 中不明确,请修复它,指定 table 名称:

await connection.execute('''
        INSERT INTO my_table(cat, roles)
        VALUES(, )
        ON CONFLICT (cat)
        DO UPDATE SET roles = array_cat(my_table.roles, )
        ''', cat, roles)

请注意,函数 array_append() 将一个元素附加到数组。您可以改用 array_cat()。但是,它可能会导致单个数组中出现重复元素。如果你的目标是在数组中有不同的元素,你应该在 Postgres 中定义一个自定义函数:

create or replace function public.array_merge(anyarray, anyarray)
returns anyarray language sql
as $function$
    select 
        array(
            select unnest()
            union
            select unnest()
            order by unnest
        )
$function$;

并用它代替 array_cat()