问题描述
我正在尝试插入具有数据类型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",...
二进制格式可以更快,这是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 ...
...应该真正提出这一点:
错误:“用户”处或附近的语法错误
因为user
是reserved word。您必须将其双引号使它起作用。但不要将user
用作Postgres标识符。曾经。
创建表之所以有效,是因为表名在那里是架构限定的,这使得表名是明确的:
CREATE TABLE public.user ( ...