为了账号安全,请及时绑定邮箱和手机立即绑定

使用 pgx 使用 JSONBArray 时出现“错误的元素类型”

使用 pgx 使用 JSONBArray 时出现“错误的元素类型”

Go
动漫人物 2022-06-27 15:30:14
我正在尝试插入一个具有inventorywith 数据类型的新行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($1, $2, $3) 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 表定义: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));可能是什么问题?任何想法都会有所帮助。
查看完整描述

1 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

输入jsonb[]pgx 被破坏

至于你报告的错误信息:


"Severity": "ERROR",

"Code": "42804",

"Message": "wrong element type",

...

pgx 上的Guthub 页面显示:


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


所以你使用的是二进制协议。为此,数据类型必须使用兼容的二进制格式,并且似乎ARRAY of jsonb没有正确编码?有关的:


PostgreSQL/PostGIS - PQexecParams - 错误的元素类型

幸运的是,作者似乎昨天才解决了这个问题:(!)


jackc:修复 JSONBArray 以包含 JSONB 的元素


安装包含提交 79b05217d14ece98b13c69ba3358b47248ab4bbc 的最新版本后,您的问题应该会消失


jsonb[]与jsonb嵌套 JSON 数组相比

使用 plainjsonb而不是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<>在这里摆弄


这也应该避免你的错误。


附加错误

你的INSERT命令:


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

...真的应该提出这个:


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


因为user是保留字。您必须双引号才能使其正常工作。但不要将user其用作 Postgres 标识符。曾经。


表创建工作,因为那里的表名是模式限定的,这使得它明确:


CREATE TABLE public.user ( ...


查看完整回答
反对 回复 2022-06-27
  • 1 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信