7

我想使用 node-postgres 模块在 postgres 中创建一个“准备好的语句”。我想创建它而不将其绑定到参数,因为绑定将在循环中进行。

在我阅读的文档中:

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

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

4

3 回答 3

15

我刚刚找到了node-postgres 的作者关于这个问题的答案。

使用 node-postgres 第一次发出命名查询时,它会被一次性解析、绑定和执行。在同一连接上发出的具有相同名称的每个后续查询将自动跳过“解析”步骤,仅重新绑定并执行已计划的查询。

目前 node-postgres 不支持创建命名的、准备好的查询而不执行查询的方法。此功能在 libpq 和客户端/服务器协议(由纯 javascript 绑定使用)中受支持,但我没有直接在 API 中公开它。我认为这会增加 API 的复杂性而没有任何真正的好处。由于命名语句绑定到创建它们的客户端,因此如果客户端断开连接并重新连接或从客户端池返回不同的客户端,则命名语句将不再起作用(它需要重新解析)。

于 2012-09-08T18:54:23.673 回答
2

您可以为此使用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) {...})
}
于 2016-08-28T22:29:59.893 回答
1

更新:再次阅读您的问题,这就是我认为您需要做的。您还需要传递一个“值”数组。

只是为了澄清;您通常会“准备”您的查询,只需准备您传递给它的对象,而不需要值数组。然后在您通常“执行”查询的地方,在对象中设置值数组并将其传递给查询。如果是第一次,驱动程序将在第一时间为您做实际的准备,并为其余的迭代做简单的绑定和执行。

于 2012-09-08T15:56:28.903 回答