用于服务器端游标的Psycopg2 rowcount

时间:2018-01-05 10:02:14

标签: python postgresql psycopg2

我正在查询Postgres数据库中的大量结果,并希望使用服务器端游标将结果传输到我的客户端。看起来当我执行此操作时,在执行查询后,光标的rowcount属性现在设置为-1。我正在创建光标:

with db.cursor('cursor_name') as cursor:

有没有办法在从数据库中流式传输结果时查找查询结果的数量? (我可以做SELECT COUNT(*),但我想避免这种情况,因为我试图抽象出查询周围的代码,这会使API复杂化。

1 个答案:

答案 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(*),但一旦完成检索数据应该很快。