在使用pgx的JSONBArray时出现“错误的元素类型” pgx中的类型jsonb[]已损坏 jsonb[]与jsonb与嵌套JSON数组其他错误

问题描述

我正在尝试插入具有数据类型some_table的{​​{1}}的新行:

inventory

但是出现以下错误

jsonb[]

Postgres表定义:

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($1,$2,$3) RETURNING uuid,email,"password"`,requestemail,requestPassword,inventory)

可能是什么问题?任何想法都会有所帮助。

解决方法

pgx中的类型jsonb[]已损坏

关于您报告的错误消息:

"Severity": "ERROR","Code": "42804","Message": "wrong element type",...

Guthub page on pgx显示:

二进制格式可以更快,这是pgx接口使用的格式。

因此,您正在使用二进制协议。为此,数据类型必须使用兼容的二进制格式,并且看来ARRAY of jsonb编码不正确?相关:

幸运的是,作者似乎有fixed this just yesterday:(!)

jackc:修复JSONBArray以包含JSONB元素

一旦您安装了包含commit 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 提琴here

那也应该避免您的错误。

其他错误

您的INSERT命令:

INSERT INTO user ("email","password","inventory") VALUES ...

...应该真正提出这一点:

错误:“用户”处或附近的语法错误

因为userreserved word。您必须将其双引号使它起作用。但不要将user用作Postgres标识符。曾经。

创建表之所以有效,是因为表名在那里是架构限定的,这使得表名是明确的:

CREATE TABLE public.user ( ...