在服务器端游标的情况下,虽然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(*),但一旦完成检索数据应该会很快。