4

我正在使用pg-promisePostgreSQL 中的 like 子句执行选择查询。不幸的是,查询失败并显示错误代码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 承诺:4.3.2

PostgreSQL:9.6

节点:5.7.1

更新:1 我可以使用queryAPI(纯文本 sql)运行查询,但不能使用each. 谁能解释为什么 LIKE 子句each在使用ParameterizedAPI 时失败。

4

1 回答 1

7

ParameterizedQuery API

查询中只能使用基本变量($1$2等),因为参数化查询由数据库服务器格式化。

PreparedStatementParameterizedQuery类型表示执行它们的node-postgres驱动程序中的相应对象。这些对象封装了查询和格式化参数。

即这两个对象的重点是将查询和格式化参数都传递到服务器,因此它们在那里被格式化,而不是使用内部查询格式化引擎。

因此,您无法访问pg-promise的内部查询格式化功能,例如$1#语法。当您直接使用查询、作为查询字符串或作为QueryFile对象时,可以使用pg-promise语法进行查询格式化。

使用PreparedStatementParameterizedQuery,您只能访问$1, $2,...由数据库服务器支持的基本类型的参数格式,没有其他权限。


PS 我是pg-promise的作者。

于 2016-06-13T13:20:03.117 回答