, столбец ‹columnName› имеет тип jsonb, но выражение имеет тип text[]

Имейте массив, как показано ниже, его необходимо сохранить в столбце JSONB:

[{"FoodType":"veg","pref":"High"}
,{"FoodType":"sea food","pref":"Medium"}
,{"FoodType":"Chicken","pref":"Low"}]

Я просто передаю объект req.body (из Express) для вставки в БД.

db.one('insert into foodies(FoodieName, FoodPref,country,languagePref)' +
'values(${FoodieName}, $[FoodPref], ${country} ,${languagePref})  RETURNING FoodieId',req.body)

**БД PG через библиотеку pg-promise выдает ошибку:

{ [error: column "foodpref" is of type jsonb but expression is of type text[]]
name: 'error',
length: 196,
severity: 'ERROR',
code: '42804',
detail: undefined,
hint: 'You will need to rewrite or cast the expression.',
position: '123',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_target.c',
line: '529',
routine: 'transformAssignedExpr' }
POST /api/member 500 638.510 ms - 57

я думаю, что его драйвер выдает массив cos: функция (arr) в formatting.js [в pg-promise lib] возвращает строку, и postgres не может ее переварить. Если массив вложен в какой-либо объект, он работает гладко, например.

"MyPref" : {Same Object array as above}

Здесь MyPref без проблем проходит через столбец «FoodPref».


person sunil gupta    schedule 14.11.2016    source источник


Ответы (1)


Если массив вложен в какой-либо объект, то он работает гладко

Это указывает на то, что вы неправильно передаете данные форматирования. Вместо передачи ваших данных для JSONB в виде массива вы передаете массив внутренних объектов.

Если вы передадите его как свойство объекта, он будет работать так, как вы сказали. Чтобы передать его как параметр внутри массива, вам нужно передать его внутри массива:

var data = [{"FoodType":"veg","pref":"High"}
,{"FoodType":"sea food","pref":"Medium"}
,{"FoodType":"Chicken","pref":"Low"}]

query('bla-bla $1', [data])

то есть ваша проблема в том, что вы передаете его как:

query('bla-bla $1', data)

который неправильно интерпретирует массив - данные JSONB как массив значений - параметров.

ОБНОВЛЕНИЕ

См. также этот связанный вопрос.

person vitaly-t    schedule 14.11.2016
comment
Итак, я должен прекратить передавать req.body напрямую и создавать отдельные объекты для каждого столбца??? (проверьте обновленный вопрос для запроса, используемого для вставки) - person sunil gupta; 20.11.2016
comment
извините за поздний ответ ... решил это, передав отдельные объекты в качестве параметра вместо req.body .... дополнительно передал переменную в json.stringify, которая имела массив JSON. - person sunil gupta; 03.12.2016