在pg-promise中使用数组

时间:2019-10-11 20:00:58

标签: pg-promise

我正在使用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)

1 个答案:

答案 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