如何使用 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()
。
我正在尝试通过 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()
。