2016-09-14 69 views
3

我無法插入文本當文本中包含字符串我的數據庫中的文本「$(...)」 作爲我的代碼返回錯誤:屬性「...」不存在。

const pgp = require('pg-promise')({ promiseLib: bluebird }); 
const db = pgp(process.env.DATABASE_URL); 
let values = [{text: 'this is fine'}, {text: 'this fails $(...)'}]; 
let cs = new pgp.helpers.ColumnSet(['text']); 
let query = pgp.helpers.insert(values, cs); 
db.manyOrNone(query); 

有沒有某種「這只是文本」屬性我錯過了?

感謝

EDIT使用$()時,語法等變量添加到整個SQL調用 誤差僅爲出現

'use strict'; 
const bluebird = require('bluebird'); 
const pgp = require('pg-promise')({ promiseLib: bluebird }); 
const db = pgp('postgres://localhost/okeydokey-local'); 

db.any(
    'CREATE TABLE text_table (' + 
    'text_column text ' + 
    ')' 
); 
let values = [{ text_column: 'this is fine' }, { text_column: 'this fails $(test)' }]; 
let cs = new pgp.helpers.ColumnSet(['text_column'], {table: 'text_table'}); 
let query = pgp.helpers.insert(values, cs); 
console.log(query); 
db.manyOrNone(query + 
    'some more SQL dependent on $(somethingElse)', 
    { 
    somethingElse: 'someValue' 
    } 
); 

輸出

insert into "text_table"("text_column") values('this is fine'),('this fails $(test)') 
Unhandled rejection Error: Property 'test' doesn't exist. 
+0

請更確切地說明哪一行/操作無法正確執行。還請提供生成的查詢和完整的代碼(您的示例中的代碼無法工作,因爲您在生成查詢時未指定任何表)。 –

回答

2

下面一行產生的最終查詢:

let query = pgp.helpers.insert(values, cs); 
//=>insert into "text_table"("text_column") values('this is fine'),('this fails $(test)') 

它不是進一步格式化的查詢模板,它應該直接執行。

在你的代碼試圖格式化最終的查詢字符串,它打破試圖在你的格式化對象定位屬性test

+0

是否有可能使用一個輔助產生一個插入查詢,如 「插入‘text_table’(‘text_column’)VALUES(」這是好的「),(」失敗$(測試)「) 衝突做更新設置... 正如我希望做類似的事情,因爲這其中,目前我的更新語句輸入使用$(變量) –

+0

@Nathsn埃文特變數,只是你的「ON衝突」的一部分追加到生成的查詢字符串。 –

+0

@NathanEvans如果由於某些原因你想修改一個需要格式化的字符串,你應該單獨生成它,例如通過'pgp.as.format()'。您不應該嘗試向生成的最終查詢中注入變量,因爲它已經可能包含看起來像變量的字符串,無法知道它可能具有哪些字符串值。 –