我正在尝试针对postgresql服务器(9.3版)调试node.js中“node pg cursor”模块的问题
该模块允许对select中的N行进行顺序读取,并通过发送

cur.read(N): 'Execute' on portal=unnamed, rows=N

此命令最多获取N行,我们可以继续以增量方式获取行,直到最后接收
CommandComplete
ReadyForQuery

现在我的问题是,在获取所有行并到达执行序列的末尾之前,我想退出扩展命令:我想增量地获取N行、N行、N行,。。有一次我觉得我已经够多了。
当我这样做(通过Execute停止获取)时,查询似乎永远达不到CommandComplete或ReadyForQuery。这看起来很正常,因为没有任何东西告诉扩展查询我再也不会从中请求行。
除了关闭连接之外,是否有一个命令在不从门户获取所有行的情况下到达CommandComplete或ReadyForQuery?
我试图发送Close并接收CloseComplete,但它没有转到ReadyForQuery。
如果我通过在协议上发送垃圾来强制错误响应,我将到达ReadyForQuery,但这似乎不是很干净。。。

最佳答案

我想你指的是这个,in the documentation
如果Execute在完成门户的执行之前终止(由于达到非零的结果行计数),它将发送一条PortalSuspended消息;此消息的出现告诉前端应针对同一门户发出另一个执行以完成操作。在门户执行完成之前,不会发送指示源SQL命令完成的CommandComplete消息。因此,Execute阶段总是由以下消息之一的出现而终止:CommandCompleteEmptyQueryResponse(如果门户是从空查询字符串创建的)、ErrorResponsePortalSuspended
可能,您得到的是PortalSuspended,您希望放弃门户,而不执行任何其他门户或使用任何其他结果。
如果是,我想您可以发送一条消息:
在完成每一系列扩展查询消息时,前端应发出同步消息。如果当前事务不在BEGIN/COMMIT事务块中,则此无参数消息将导致后端关闭该事务(“close”表示如果没有错误,则提交,如果有错误,则回滚)。然后发出ReadyForQuery响应。
您可能希望首先针对门户发布Sync
关闭消息关闭现有的准备好的语句或门户并释放资源。
所以我认为你需要做的是,在信息流方面:
Close
Parse命名门户
Bind
循环:
Describe具有行数限制以获取某些行
如果不再需要行;那么
Execute入口
跳出循环
如果收到Close
跳出循环
CommandComplete
等待Sync

10-06 12:02