我正在查询Postgres数据库中的大量结果,并希望使用服务器端游标将结果传输到我的客户端。看起来当我执行此操作时,在执行查询后,光标的rowcount
属性现在设置为-1
。我正在创建光标:
with db.cursor('cursor_name') as cursor:
有没有办法在从数据库中流式传输结果时查找查询结果的数量? (我可以做SELECT COUNT(*)
,但我想避免这种情况,因为我试图抽象出查询周围的代码,这会使API复杂化。
答案 0 :(得分:1)
对于服务器端游标,尽管cursor.execute()
返回,但服务器此时不一定执行查询,因此行计数不可用于psycopg2
。这与DBAPI 2.0 spec一致,它指出如果最后一个操作的行数不确定,rowcount
应为-1。
尝试使用cursor.fetchone()
强制它,例如,更新cursor.rowcount
,但仅限于检索的项目数,因此无用。 cursor.fetchall()
会导致rowcount
被正确设置,但会执行完全查询和传输您希望避免的数据。
一种可能的解决方法是避免使用完全独立的查询来获取计数,并且应该提供准确的结果:
select *, (select count(*) from test) from test;
这将导致每行都将表行计数作为最后一列附加。然后,您可以使用cursor.fetchone()
获取表行计数,然后获取最后一列:
with db.cursor('cursor_name') as cursor:
cursor.execute('select *, (select count(*) from test) from test')
row = cursor.fetchone()
data, count = row[:-1], row[-1]
现在count
将包含表格中的行数。您可以使用row[:-1]
来引用行数据。
这可能会降低查询速度,因为可能会执行可能很昂贵的SELECT COUNT(*)
,但一旦完成检索数据应该很快。