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

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);

我是否错过了某种“这只是文本”的属性?

谢谢

编辑 仅在使用$()语法将其他变量添加到整个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.

请更具体地说明哪一行/操作出现了问题。同时,请提供生成的查询和完整代码(您示例中的代码无法工作,因为在生成查询时未指定任何表)。 - vitaly-t
1个回答

2
以下代码生成最终查询语句:
let query = pgp.helpers.insert(values, cs);
//=>insert into "text_table"("text_column") values('this is fine'),('this fails $(test)')

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

在你的代码中,你试图格式化最终的查询字符串,这会导致在你的格式化对象中无法找到test属性而出错。


是否可以使用助手来生成插入查询,例如'insert into "text_table"("text_column") values('this is fine'),('this fails $(test)') on conflict do update set ... 因为我希望做类似的事情,目前我的更新语句使用$(variable)输入变量。 - Nathan Evans
@Nathsn Evant,只需将您的“ON CONFLICT”部分附加到生成的查询字符串即可。 - vitaly-t
@NathanEvans 如果出于某些原因您想修改需要格式化的字符串,您应该单独生成它,例如通过 pgp.as.format()。您不应尝试将变量注入到生成的最终查询中,因为它可能已经包含看起来像变量的字符串,无法知道它可能具有什么字符串值。 - vitaly-t

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接