如何在 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]]);
我正在使用包含运算符 @>
查询数组列 (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]]);