2015-12-11 42 views
0

我有json編碼的數據,可以有以下格式: {「forumla」:「callTo(\」par1 \「,\」par2 \「)」} 當我嘗試與一jsonb柱將其插入PostgreSQL表,我得到以下錯誤:插入到jsonb值與Qt

SQL error QSqlError(-1, "QPSQL: Unable to create query", "ERROR: invalid input syntax for type json 
LINE 1: ...15-12-11 15:20:17.350', 21590, '{ "forumla... 
             ^
DETAIL: Token "par1" is invalid. 
CONTEXT: JSON data, line 1: ..." : "callTo(\\"par1... 

「)

看起來Qt的某種方式取代轉義引號(\」)與一個轉義反斜線和報價。通過PSQL CLI作品插入的字符串。 有人可以幫我嗎?

在此先感謝。

更新:
我刪除了綁定,並用一個單一的替換雙反斜槓。 現在我可以成功插入值。

QSqlField f(name, QVariant::String); 
f.setValue(fields.value(name)); 
const QString value = db.driver()->formatValue(f).replace("\\\\", "\\"); 

該問題可能源於Qt(至少在5.x之前)不知道數據庫中的json。所以它只能把它看作一個字符串,並且看到需要避免反斜槓。

這顯然不是一個理想的解決方案。

更新2:
我發現可接受的解決方案。 Qt(至少4.7)假定反斜槓是字符串值中的特殊字符。從9.1開始,這不再是這種情況(默認情況下)。見http://www.postgresql.org/docs/9.4/static/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-ESCAPE
所以我不得不設置以下這樣PostgreSQL的再次呈現\是轉義反斜線:

QSqlQuery query(db); 
query.exec("SET standard_conforming_strings TO false"); 
+0

你使用準備好的語句(如[這裏](http://stackoverflow.com/a/19045489/ 1499698))?它不應該是綁定參數的問題。 – pozs

+0

我使用綁定變量,(特別是我使用QDjango庫),這可能是QString改變的原因。 – Daniel82

回答

1

這樣看來,Qt是自動轉義任何反斜槓\你在你的字符串有。爲什麼 - 我不知道。

你可以嘗試使用單引號',而不是」這可能是因爲Qt的只關心轉義雙引號所以通過寫。

"callTo('par1', 'par2')") 

您可以繞過這個問題(更新:確認這由OP工作,但顯然不是理想的解決方案,因爲它只是繞過了這個問題)

此外或者可能Qt有一個選項,您可以用來禁用此功能,但恐怕我不夠熟悉與它作爲工具能夠告訴你它是否存在。

希望這會有所幫助 - 這不是我想要給你的答案,但是由於缺乏更多知識淵博的Qt專家,它可能會給你一些關於嘗試的想法!

+0

我試圖用「替換」,但現在Qt似乎認爲它不必爲了避免引號。它逃脫了\ \現在它什麼都不做。 – Daniel82

+1

呵呵。所以它本身就是逃避。多麼奇怪。如果在雙引號內使用'自己的'(所以''callTo('par1','par2')「')單引號(反之亦然),會發生什麼情況不會結束由其他引號類型啓動的字符串。 –

+0

單引號工作,謝謝。我可以將此作爲臨時解決方案。但我真的很想深究這一點。 – Daniel82