pg-promise使用$()插入文本

时间:2016-09-14 14:23:09

标签: node.js pg-promise

当文本包含字符串" $(...)"时,我在将文本插入数据库时​​遇到问题。 当我的代码返回错误:属性' ...'不存在。

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.

1 个答案:

答案 0 :(得分:2)

以下行生成您的最终查询:

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

它不是用于进一步格式化的查询模板,它应该直接执行。

在您的代码中,您尝试格式化最终查询字符串,这会破坏尝试在格式化对象中找到属性test