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) {...}) }
- node-postgres:如何执行“WHERE col IN(<dynamic值列表>)”查询?
- 如何优化Postgresql max_connections和node-postgres连接池?
- 在节点上如何执行插入如果不存在
- 使用node-postgres将文件存储在postgres中
- 是否有可能得到的SQL语句一起由node-postgres返回的错误?
- 连接池使用pg-promise
- 将嵌套的JSON从多个到多个从PostgreSQL连接到Node.js的表中返回
- 与Bluebird手动promisifying pg.connect
- nodejs应用程序的node-postgres和pg-promise