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

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

在我阅读的文档中 :

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"}); 

但是当我尝试只传递configuration对象中的文本和名称键,我得到一个exception:

(已翻译)消息绑定了0个参数,但准备好的语句需要1个

有什么我失踪? 你如何创build/准备一个陈述,而不将其绑定到具体的价值,以避免在循环的每一步重新准备陈述?

我只是find了node-postgres的作者在这个问题上的答案 。

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

目前,node-postgres不支持创build已命名的准备好的查询并且不执行查询的方式。 libpq和客户机/服务器协议(由纯javascript绑定使用)支持此function,但是我没有直接在API中公开它。 我认为这会增加API的复杂性而没有任何实际的好处。 由于命名语句绑定到创build它们的客户端,如果客户端断开并重新连接,或者从客户端池返回不同的客户端,则命名语句将不再工作(需要重新parsing)。

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

只是为了澄清; 在那里你通常会“准备”你的查询,只是准备你传递给它的对象,没有值数组。 然后,通常在“执行”查询的位置,在对象中设置值数组并将其传递给查询。 如果这是第一次,那么驱动程序会在第一次为你做实际的准备工作,并简单地为迭代的其余部分进行绑定和执行。

你可以使用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) {...}) }