2016-11-14 70 views
3

有無陣列如下,需要被保存在JSONB柱:,柱<columnName>是類型jsonb的但表達的類型是文本的[]

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

我簡單地傳遞req.body對象(從快遞)插入到數據庫。

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

** PG經由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 

我認爲它驅動的問題餘弦陣列:功能(ARR)在formatting.js [以pg-承諾LIB]返回字符串和postgres不能消化它。如果array嵌套在任何對象中,那麼它可以平滑地工作,例如

"MyPref" : {Same Object array as above} 

這裏MyPref在列「FoodPref」中通過沒有任何問題。

+0

您應該附上您正在執行的確切查詢。要不執行查詢,請使用方法[pgp.as.format](http://vitaly-t.github.io/pg-promise/formatting.html#.format)。 –

+0

我問過你使用'pgp.as.format'生成的查詢來更新問題,而不是你傳遞給查詢方法的問題。 –

+0

對不起:(不能得到查詢...請幫助與示例代碼和位置得到查詢生成。我嘗試response.log在.one方法buts返回相同的查詢我已經把問題 –

回答

0

如果數組嵌套在任何對象,然後它工作順利

這點,你是不是在傳遞正確格式化數據。不是將數據作爲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數據 - 參數。

+0

因此,我應該停止直接傳遞req.body併爲每個列創建單獨的對象???(檢查用於插入的查詢的更新問題) –

+0

對不起延遲迴復......通過傳遞單個對象作爲參數代替req.body ....來解決它。另外還傳遞了具有JSON數組的json.stringify中的變量。 –

相關問題