从 PQexec 流式传输 libpq 结果

Streaming libpq results from PQexec

在尝试通过 libpq PQexec 从 C 中的 Postgres 9.3 下载大量数据时,我想知道是否有办法从服务器流式传输结果集。从顶部看,我可以看到我的内存利用率在调用 PQexec 时大致增加了预期的结果集大小。我想遍历结果和 "throw away" 处理后的结果,以降低处理节点上的内存利用率。我找不到在 docs. Something like psycopg2's fetchmany 中提及此类行为是理想的。

从 libpq 批量重写查询到 运行 的结果是 "stream" 的唯一方法吗?

使用足够新的 libpq(libpq-5.5 与 PostgreSQL 9.2 一起发布),您可以调用 PQsetSingleRowMode,如 Retrieving Query Results Row-By-Row 中所述。 PQexec 必须由异步 PQsendQuery.

替换

否则,适用于所有版本的技术是在 SQL 级别打开游标(请参阅 DECLARE...CURSOR),然后通过连续的 PQexec 调用从中获取游标,直到完成。这就是 FETCH_COUNT 在命令行工具 psql 中的实现方式。
它还有一个优点是,当游标打开并且程序仍在循环结果时,可以在同一连接上执行其他查询。