如何向PostgreSQL查询语句的单引号内部传递参数?
PostgreSQL参数绑定报错修复方案
错误原因
报错的核心原因是$1、$2参数占位符被包裹在单引号内部,PostgreSQL预编译机制会将单引号内的内容识别为普通字符串,不会解析为参数占位符,因此系统判定这条SQL无需绑定参数,才会返回对应报错。
修复代码
写法1:数值乘固定时间间隔(兼容性好)
const text = `UPDATE glacier_restore_progress SET status='completed', restore_end=CURRENT_TIMESTAMP, restore_expire=DATE_TRUNC('minutes', current_timestamp + $1 * interval '1 minute') WHERE file_path = $2 AND date_trunc('minutes', current_timestamp - $1 * interval '1 minute') <= restore_start`; const values = [restoreDuration, fileKey]; await pool.query(text, values);
写法2:使用make_interval内置函数(可读性更强)
PostgreSQL提供的make_interval函数支持直接传入数值构造时间间隔,代码可读性更高:
const text = `UPDATE glacier_restore_progress SET status='completed', restore_end=CURRENT_TIMESTAMP, restore_expire=DATE_TRUNC('minutes', current_timestamp + make_interval(mins => $1)) WHERE file_path = $2 AND date_trunc('minutes', current_timestamp - make_interval(mins => $1)) <= restore_start`; const values = [restoreDuration, fileKey]; await pool.query(text, values);
注意事项
- 所有参数占位符
$n不需要额外加单引号包裹,pg库会自动根据参数类型做转义处理,手动加单引号会导致占位符失效,还会引发SQL注入风险。 - 字符串类型的参数也无需手动加单引号,预编译机制会自动完成类型匹配。
内容的提问来源于stack exchange,提问作者ahkam
相关产品推荐
相关产品推荐

