【问题标题】:Query formatting for Parameterized Queries参数化查询的查询格式
【发布时间】:2016-06-13 05:34:02
【问题描述】:

我正在使用pg-promise 在 PostgreSQL 中使用 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-promise: 4.3.2

PostgreSQL:9.6

节点:5.7.1

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

【问题讨论】:

    标签: postgresql parameterized-query pg-promise


    【解决方案1】:

    来自ParameterizedQuery API

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

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

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

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

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


    附:我是pg-promise的作者。

    【讨论】:

    • 感谢 @vitaly-t 回答我的问题并提供支持文档的链接(赞成详细说明)。在我希望将like 子句与参数一起使用的场景中,您有什么建议? query API 使用是否适合场景或其他更好的方法。
    • 您有tons of examples 可供选择。
    猜你喜欢
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 2014-04-06
    相关资源
    最近更新 更多