"wrong element type" 使用 pgx 使用 JSONBArray 时
"wrong element type" when using JSONBArray using pgx
我正在尝试插入一个 inventory
数据类型为 jsonb[]
:
的新行
elements := []pgtype.Text{{String: `{"adsda": "asdasd"}`, Status: pgtype.Present}}
dimensions := []pgtype.ArrayDimension{{Length: 1, LowerBound: 1}}
inventory := pgtype.JSONBArray{Elements: elements, Dimensions: dimensions, Status: pgtype.Present}
row = db.pool.QueryRow(context.Background(), `INSERT INTO user ("email", "password", "inventory") VALUES(, , ) RETURNING uuid, email, "password"`, requestEmail, requestPassword, inventory)
但我收到以下错误:
"Severity": "ERROR",
"Code": "42804",
"Message": "wrong element type",
"Detail": "",
"Hint": "",
"Position": 0,
"InternalPosition": 0,
"InternalQuery": "",
"Where": "",
"SchemaName": "",
"TableName": "",
"ColumnName": "",
"DataTypeName": "",
"ConstraintName": "",
"File": "arrayfuncs.c",
"Line": 1316,
"Routine": "array_recv"
Postgres table 定义:
CREATE TABLE public.user (
uuid uuid NOT NULL DEFAULT uuid_generate_v4(),
email varchar(64) NOT NULL,
"password" varchar(32) NOT NULL,
inventory _jsonb NULL,
CONSTRAINT user_pk PRIMARY KEY (uuid)
);
可能是什么问题?任何想法都会有所帮助。
pgx 中的类型 jsonb[]
已损坏
关于您反馈的错误信息:
"Severity": "ERROR",
"Code": "42804",
"Message": "wrong element type",
...
The binary format can be substantially faster, which is what the pgx interface uses.
所以你使用的是二进制协议。为此,数据类型必须使用兼容的二进制格式,似乎 ARRAY of jsonb
编码不正确?相关:
- PostgreSQL/PostGIS - PQexecParams - wrong element type
幸运的是,作者似乎有 fixed this just yesterday: (!)
jackc: Fix JSONBArray to have elements of JSONB
安装包含提交 79b05217d14ece98b13c69ba3358b47248ab4bbc 的最新版本后,您的问题应该会消失
jsonb[]
与 jsonb
嵌套 JSON 数组
使用普通 jsonb
代替 jsonb[]
可能更简单。 JSON 可以自己嵌套数组。考虑:
SELECT '[{"id": 1}
, {"txt": "something"}]'::jsonb AS jsonb_array
, '{"{\"id\": 1}"
,"{\"txt\": \"something\"}"}'::jsonb[] AS pg_array_of_jsonb;
两者都可以在 Postgres 中取消嵌套:
SELECT jsonb_array_elements('[{"id": 1}, {"txt": "something"}]'::jsonb) AS jsonb_element_from_json_array;
SELECT unnest('{"{\"id\": 1}","{\"txt\": \"something\"}"}'::jsonb[]) AS jsonb_element_from_pg_array;
同样的结果。
db<>fiddle here
那也应该可以避免你的错误。
附加错误
您的 INSERT
命令:
INSERT INTO user ("email", "password", "inventory") VALUES ...
...真的应该提出这个:
ERROR: syntax error at or near "user"
因为user
是一个reserved word。您必须 double-quote 它才能正常工作。但不要使用 user
它作为 Postgres 标识符。曾经.
table 的创建是有效的,因为 tablename 是 schema-qualified,这使得它明确无误:
CREATE TABLE public.user ( ...
我正在尝试插入一个 inventory
数据类型为 jsonb[]
:
elements := []pgtype.Text{{String: `{"adsda": "asdasd"}`, Status: pgtype.Present}}
dimensions := []pgtype.ArrayDimension{{Length: 1, LowerBound: 1}}
inventory := pgtype.JSONBArray{Elements: elements, Dimensions: dimensions, Status: pgtype.Present}
row = db.pool.QueryRow(context.Background(), `INSERT INTO user ("email", "password", "inventory") VALUES(, , ) RETURNING uuid, email, "password"`, requestEmail, requestPassword, inventory)
但我收到以下错误:
"Severity": "ERROR",
"Code": "42804",
"Message": "wrong element type",
"Detail": "",
"Hint": "",
"Position": 0,
"InternalPosition": 0,
"InternalQuery": "",
"Where": "",
"SchemaName": "",
"TableName": "",
"ColumnName": "",
"DataTypeName": "",
"ConstraintName": "",
"File": "arrayfuncs.c",
"Line": 1316,
"Routine": "array_recv"
Postgres table 定义:
CREATE TABLE public.user (
uuid uuid NOT NULL DEFAULT uuid_generate_v4(),
email varchar(64) NOT NULL,
"password" varchar(32) NOT NULL,
inventory _jsonb NULL,
CONSTRAINT user_pk PRIMARY KEY (uuid)
);
可能是什么问题?任何想法都会有所帮助。
pgx 中的类型 jsonb[]
已损坏
关于您反馈的错误信息:
"Severity": "ERROR",
"Code": "42804",
"Message": "wrong element type",
...
The binary format can be substantially faster, which is what the pgx interface uses.
所以你使用的是二进制协议。为此,数据类型必须使用兼容的二进制格式,似乎 ARRAY of jsonb
编码不正确?相关:
- PostgreSQL/PostGIS - PQexecParams - wrong element type
幸运的是,作者似乎有 fixed this just yesterday: (!)
jackc: Fix JSONBArray to have elements of JSONB
安装包含提交 79b05217d14ece98b13c69ba3358b47248ab4bbc 的最新版本后,您的问题应该会消失
jsonb[]
与 jsonb
嵌套 JSON 数组
使用普通 jsonb
代替 jsonb[]
可能更简单。 JSON 可以自己嵌套数组。考虑:
SELECT '[{"id": 1}
, {"txt": "something"}]'::jsonb AS jsonb_array
, '{"{\"id\": 1}"
,"{\"txt\": \"something\"}"}'::jsonb[] AS pg_array_of_jsonb;
两者都可以在 Postgres 中取消嵌套:
SELECT jsonb_array_elements('[{"id": 1}, {"txt": "something"}]'::jsonb) AS jsonb_element_from_json_array;
SELECT unnest('{"{\"id\": 1}","{\"txt\": \"something\"}"}'::jsonb[]) AS jsonb_element_from_pg_array;
同样的结果。
db<>fiddle here
那也应该可以避免你的错误。
附加错误
您的 INSERT
命令:
INSERT INTO user ("email", "password", "inventory") VALUES ...
...真的应该提出这个:
ERROR: syntax error at or near "user"
因为user
是一个reserved word。您必须 double-quote 它才能正常工作。但不要使用 user
它作为 Postgres 标识符。曾经.
table 的创建是有效的,因为 tablename 是 schema-qualified,这使得它明确无误:
CREATE TABLE public.user ( ...