如何在 Node / pg-pool 中参数化 Postgres 数组值

How do I parameterize a Postgres array value in Node / pg-pool

我正在使用包含运算符 @> 查询数组列 (style text[])。我的原始查询是:

SELECT * FROM songs WHERE style @> '{Acoustic}'

当我将其放入节点(使用 pg-pool)并尝试对其进行参数化时,值引用周围的大括号似乎阻止了它正常工作。请注意这些示例:

const style = 'Acoustic';

// this works, but I don't want to in-line like this:
const { rows } = await pool.query(`SELECT * FROM songs WHERE style @> '{` + style + `}'`);

// this fails with 'error: bind message supplies 1 parameters, but prepared statement "" requires 0'
const { rows } = await pool.query(`SELECT * FROM songs WHERE style @> '{}'`, [style]);

参数化的正确方法是什么?

const { rows } = await pool.query(`SELECT * FROM songs WHERE style @> '{}'`, [style]);

这里的$1,在引号里,只是作为字符串的一部分,不是可替换变量。如果你想传入一个标量并将其作为数组处理,你应该可以这样做:

const { rows } = await pool.query(`SELECT * FROM songs WHERE style @> ARRAY[]`, [style]);

另一种方法是 node.js 直接绑定数组(未测试):

const { rows } = await pool.query(`SELECT * FROM songs WHERE style @> `, [[style]]);