node-postgres:如何在不执行查询的情况下准备语句?

时间:2012-09-08 14:36:42

标签: node.js node-postgres

我想使用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

我有什么遗失的吗?如何创建/准备语句而不将其绑定到特定值,以避免在循环的每个步骤中重新准备语句?

3 个答案:

答案 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) {...})
}