我正在使用pg-promise,但不了解如何运行此查询。第一个查询有效,但是我想使用pg-promise的安全字符转义,然后尝试第二个查询不起作用。
作品:
db.any(`SELECT title FROM books WHERE id = ANY ('{${ids}}') ORDER BY id`)
不起作用
db.any(`SELECT title FROM books WHERE id = ANY ($1) ORDER BY id`, ids)
答案 0 :(得分:2)
该示例有两个问题。首先,它与documentation tells you:
不符重要提示::切勿在ES6模板字符串中使用保留的
${}
语法,因为它们不知道如何格式化PostgreSQL的值。在ES6模板字符串中,您应该仅使用4个替代方法之一-$()
,$<>
,$[]
或$//
。
像在第一个示例中一样,手动查询格式是一种非常糟糕的做法,会导致不良情况,从损坏的查询到SQL注入。
第二个问题是切换到正确的SQL格式后,您应该使用CSV Filter正确设置值列表的格式:
db.any(`SELECT title FROM books WHERE id IN ($/ids:csv/) ORDER BY id`, {ids})
或通过索引变量:
db.any(`SELECT title FROM books WHERE id IN ($1:csv) ORDER BY id`, [ids])
请注意,由于我们在此处提供了一个开放值列表,因此我也从ANY
更改为IN
操作数。
并且您可以随意使用过滤器:list
。