我正在使用 pg-promise
在 PostgreSQL 中执行带有 like 子句的选择查询。不幸的是,查询失败,错误代码为 08P01
和错误消息
bind message supplies 1 parameters, but prepared statement "" requires 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
Node: 5.7.1
更新:1
我可以使用 query
API(纯文本 sql)运行查询,但不能使用 each
。任何人都可以解释为什么在使用 Parameterized
API 时 LIKE 子句在 each
中失败。
最佳答案
Only the basic variables (
$1
,$2
, etc) can be used in the query, because Parameterized Queries are formatted by the database server.
类型 PreparedStatement和 ParameterizedQuery表示 node-postgres 中的相应对象执行它们的驱动程序。这些对象封装了查询和格式化参数。
即这两个对象的全部意义在于将查询和格式化参数都传递到服务器,因此它们在那里被格式化,而不是使用内部查询格式化引擎。
因此,您无法访问 pg-promise 的内部查询格式化功能,例如 $1#
语法。您可以使用 pg-promise直接使用查询时查询格式的语法,作为查询字符串或 QueryFile对象。
与 PreparedStatement和 ParameterizedQuery您只能访问数据库服务器支持的基本 $1, $2,...
类型的参数格式,除此之外别无他法。
附言我是 pg-promise 的作者.
关于postgresql - 参数化查询的查询格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37782423/