我想使用node-postgres模块在postgres中创建一个“预备语句”。我想创建它而不将其绑定到参数,因为绑定将在循环中进行。
在documentation我读到:
query(object config, optional function callback) : Query
If _text_ and _name_ are provided within the config, the query will result in the creation of a prepared statement.
我试过
client.query({"name":"mystatement", "text":"select id from mytable where id=$1"});
但是当我尝试只传递文字&配置对象中的名称键,我得到一个例外:
(已翻译)消息是绑定0参数但准备好的语句需要1
我有什么遗失的吗?如何创建/准备语句而不将其绑定到特定值,以避免在循环的每个步骤中重新准备语句?
答案 0 :(得分:11)
我刚刚发现了node-postgres的作者{/ 3}}。
使用node-postgres第一次发出命名查询时,它是 一次解析,绑定和执行。发出每个后续查询 在具有相同名称的同一连接上将自动跳过 “解析”步骤,仅重新绑定并执行已计划的查询。
目前node-postgres不支持创建命名的方法, 准备好查询而不执行查询。支持此功能 在libpq和客户端/服务器协议(由纯。使用) javascript绑定),但我没有直接在API中公开它。一世 认为它会增加API的复杂性而没有任何实际好处。 由于命名语句绑定到它们所在的客户端 如果客户端已断开连接并重新连接或不同,则创建 客户端从客户端池返回,命名语句将为no 更长的工作(需要重新解析)。
答案 1 :(得分:2)
更新:再次阅读您的问题,这是我认为您需要做的事情。您还需要传递一个“值”数组。
只是为了澄清;你通常会“准备”你的查询,只需准备你传递给它的对象,而不是值数组。然后,您通常会“执行”您的查询,在对象中设置值数组并将其传递给查询。如果这是第一次,驱动程序将在第一次为您做实际的准备,并且在迭代的其余部分进行简单的绑定和执行。
答案 2 :(得分:0)
您可以使用pg-prepared:
var prep = require('pg-prepared')
// First prepare statement without binding parameters
var item = prep('select id from mytable where id=${id}')
// Then execute the query and bind parameters in loop
for (i in [1,2,3]) {
client.query(item({id: i}), function(err, result) {...})
}