13

以下のような配列を持ち、JSONB 列に保存する必要があります。

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

DB に挿入する req.body オブジェクトを (Express から) 渡すだけです。

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

**pg-promise ライブラリ経由の PG DB はエラーをスローします:

{ [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配列だと思います:formatting.jsの関数(arr)[pg-promise lib]は文字列を返し、postgresはそれを消化できません。配列が任意のオブジェクトにネストされている場合、スムーズに動作します。

"MyPref" : {Same Object array as above}

ここで、MyPref は列 "FoodPref" を問題なく通過します。

4

1 に答える 1

3

配列がオブジェクトにネストされている場合、スムーズに機能します

データを正しくフォーマットして渡していないことを示しています。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 データを値の配列として - パラメータ。

アップデート

この関連する質問も参照してください

于 2016-11-14T16:14:30.267 に答える