"неправильный тип элемента" при использовании JSONBArray с использованием 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($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 ответ

Тип jsonb[] в pgx был сломан

Что касается сообщения об ошибке, о котором вы сообщаете:

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

Страница Guthub на pgx показывает:

Двоичный формат может быть значительно быстрее, что и использует интерфейс pgx.

Итак, вы используете двоичный протокол. Для этого типы данных должны использовать совместимый двоичный формат, и кажется, чтоARRAY of jsonbкодируется неправильно? Связанные с:

К счастью для вас, автор вроде как вчера исправил: (!)

jackc: исправить JSONBArray, чтобы он содержал элементы JSONB

Ваша проблема должна исчезнуть после установки последней версии, содержащей коммит 79b05217d14ece98b13c69ba3358b47248ab4bbc

jsonb[] vs. jsonb с вложенным массивом JSON

Может быть проще использовать простой jsonb вместо того jsonb[]. JSON может сам по себе вкладывать массивы. Рассмотреть возможность:

SELECT '[{"id": 1}
       , {"txt": "something"}]'::jsonb  AS jsonb_array
     , '{"{\"id\": 1}"
        ,"{\"txt\": \"something\"}"}'::jsonb[] AS postgres_array_of_jsonb;

db<> скрипка здесь

Это также должно избежать вашей ошибки.

Дополнительная ошибка

Твой INSERT команда:

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

... должно действительно поднять это:

ОШИБКА: синтаксическая ошибка около "пользователя"

Потому как userявляется зарезервированным словом. Вам придется заключить его в двойные кавычки, чтобы он заработал. Но лучше не используйтеuserэто как идентификатор Postgres. Когда-либо.

Создание таблицы работает, потому что имя таблицы уточнено схемой, что делает его однозначным:

CREATE TABLE public.user ( ...
Другие вопросы по тегам