【问题标题】:Postgresql query problems for nodejsnodejs的postgresql查询问题
【发布时间】:2017-06-09 19:30:44
【问题描述】:

我正在用 node.js 制作一个应用,使用 express 框架,将 postgresql 作为我的数据库。

我必须在我的数据库中插入一些值,其中一些带有引号。例如托尼海鲜餐厅。我无法插入这样的值。

我试过了

name.replace('\'', '\\\'');

还有

name.replace("'", "\'");

但没有成功。

问题是 postgresql 服务器在运行查询之前对其进行格式化。如果查询在我的代码中看起来像这样,

insert into venues values (nextval('venue_venueid_seq'),'"+name+"','"+api+"','"+location+"','"+latitude+"','"+longitude+"','"+category+"','"+category_generalized+"')

然后 postgresql 像这样格式化它(我通过打印 client.query 对象找到它)

insert into venues values (nextval(\'venue_venueid_seq\'),\'Tony\'s Seafood Restaurant\',\'Google Places\',\'18863 California 1, Marshall\',\'38.146777\',\'-122.882987\',\'restaurant,food,establishment\',\'Eatery,Eatery,establishment\')

你看到 postgresql 已经在我的字符串的开始和结束引号之前放置了斜杠,所以我以编程方式插入到字符串中间的转义斜杠不起作用。

如何插入这样的值?请帮忙。

【问题讨论】:

  • postgres 是否允许您明确列出接收插入数据值的列的名称?
  • 即使我在插入查询中明确包含列列表,问题仍然存在......而且我在选择查询中遇到了同样的问题
  • 如果您不以编程方式转义撇号会怎样? \托尼餐厅\ ?
  • 看看这个页面是否对你有帮助。查看插入值作为参数传递的部分:github.com/brianc/node-postgresclient.query("INSERT INTO beatles(name, height, birthday) values($1, $2, $3)", ['John', 68, new Date(1944, 10, 13)]);
  • 使用您展示的参数化查询是解决方案。非常感谢!

标签: node.js node-postgres


【解决方案1】:

您也可以使用pg-escape 模块来处理这种情况。这个模块还有其他一些有用的转义方法。

安装

npm install pg-escape

示例

var sql = escape('INSERT INTO %I VALUES(%L)', 'books', "O'Reilly");

console.log(sql);

【讨论】:

  • 问题在于手动查询格式 - 永远不要那样做!根据文档使用查询格式化方法,你不会有任何问题。没有必要在其中引入另一个模块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
相关资源
最近更新 更多