En el caso de un cursor del lado del servidor, aunque cursor.execute()
devuelve, la consulta no ha sido necesariamente ejecutada por el servidor en ese momento, por lo que el recuento de filas no está disponible para psycopg2
. Esto es coherente con las especificaciones DBAPI 2.0
que establece que rowcount
debe ser -1 si el recuento de filas de la última operación es indeterminado.
Intenta forzarlo con cursor.fetchone()
, por ejemplo, actualiza cursor.rowcount
, pero solo por la cantidad de elementos recuperados, por lo que no es útil. cursor.fetchall()
dará como resultado rowcount
sin embargo, estando configurado correctamente, realiza la consulta completa y la transferencia de datos que busca evitar.
Una posible solución que evita una consulta completamente separada para obtener el recuento y que debería dar resultados precisos es:
select *, (select count(*) from test) from test;
Esto dará como resultado que cada fila tenga el recuento de filas de la tabla adjunto como columna final. Luego puede obtener el recuento de filas de la tabla usando cursor.fetchone()
y luego tomando la última columna:
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]
Ahora count
contendrá el número de filas en la tabla. Puede usar row[:-1]
para hacer referencia a los datos de la fila.
Esto podría ralentizar la consulta porque un SELECT COUNT(*)
posiblemente costoso se realizará, pero una vez hecho esto, la recuperación de los datos debería ser rápida.