我正在使用pg-promise
在PostgreSQL中使用like子句执行select查询。遗憾的是,查询失败,错误代码为08P01
,错误消息为
绑定消息提供1个参数,但准备好的语句“”需要 0
查询如下
select user_name, user_id from users where user_name like '$1#%'
我使用参数化查询
var userQuery:pgp.ParameterizedQuery = new pgp.ParameterizedQuery("<above_query>", [userName]);
用于执行查询的API是
each(query:TQuery, values:any, cb:(row:any, index:number, data:Array<any>)=>void, thisArg?:any):XPromise<Array<any>>;
我查看了pg-promise示例,但它没有使用带参数化查询的LIKE子句。
环境详细信息
pg-promise:4.3.2
PostgreSQL:9.6
节点:5.7.1
更新:1
我可以使用query
API(纯文本sql)运行查询,但不能使用each
运行查询。任何人都可以在使用each
API时解释为什么LIKE子句在Parameterized
失败。
答案 0 :(得分:2)
在查询中只能使用基本变量(
$1
,$2
等),因为参数化查询由数据库服务器格式化。
类型PreparedStatement和ParameterizedQuery表示执行它们的node-postgres驱动程序中的相应对象。这些对象封装了查询和格式化参数。
即。这两个对象的重点是将查询和格式化参数传递到服务器中,因此它们在那里被格式化,而不是使用内部查询格式化引擎。
因此,您无权访问pg-promise的内部查询格式功能,例如$1#
语法。当您直接使用查询,查询字符串或pg-promise对象时,可以使用QueryFile语法进行查询格式化。
使用PreparedStatement和ParameterizedQuery,您只能访问数据库服务器支持的基本$1, $2,...
类型的参数格式化。
P.S。我是pg-promise的作者。