在 pg-promise 中使用数组
Using arrays with 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 () ORDER BY id`, ids)
这个例子有两个问题。首先,它违背了 documentation tells you:
IMPORTANT: Never use the reserved ${}
syntax inside ES6 template strings, as those have no knowledge of how to format values for PostgreSQL. Inside ES6 template strings you should only use one of the 4 alternatives - $()
, $<>
, $[]
or $//
.
手动查询格式化,就像在您的第一个示例中一样,是一种非常糟糕的做法,会导致不好的事情,从查询中断到 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 (:csv) ORDER BY id`, [ids])
请注意,我还从 ANY
更改为 IN
操作数,因为我们在此处提供了一个开放值列表。
您可以根据需要交替使用过滤器 :list
。
我正在使用 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 () ORDER BY id`, ids)
这个例子有两个问题。首先,它违背了 documentation tells you:
IMPORTANT: Never use the reserved
${}
syntax inside ES6 template strings, as those have no knowledge of how to format values for PostgreSQL. Inside ES6 template strings you should only use one of the 4 alternatives -$()
,$<>
,$[]
or$//
.
手动查询格式化,就像在您的第一个示例中一样,是一种非常糟糕的做法,会导致不好的事情,从查询中断到 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 (:csv) ORDER BY id`, [ids])
请注意,我还从 ANY
更改为 IN
操作数,因为我们在此处提供了一个开放值列表。
您可以根据需要交替使用过滤器 :list
。