2016-09-14 64 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()'。您不应该尝试向生成的最终查询中注入变量,因为它已经可能包含看起来像变量的字符串,无法知道它可能具有哪些字符串值。 –