No caso de um cursor do lado do servidor, embora
cursor.execute()
retorna, a consulta não foi necessariamente executada pelo servidor nesse ponto e, portanto, a contagem de linhas não está disponível para psycopg2
. Isso é consistente com a especificação DBAPI 2.0
que afirma que rowcount
deve ser -1 se a contagem de linhas da última operação for indeterminada. Tenta coagi-lo com
cursor.fetchone()
, por exemplo, atualiza cursor.rowcount
, mas apenas pelo número de itens recuperados, de modo que não é útil. cursor.fetchall()
resultará em rowcount
sendo configurado corretamente, no entanto, que realiza a consulta completa e transferência de dados que você procura evitar. Uma possível solução alternativa que evita uma consulta completamente separada para obter a contagem e que deve fornecer resultados precisos é:
select *, (select count(*) from test) from test;
Isso fará com que cada linha tenha a contagem de linhas da tabela anexada como a coluna final. Você pode então obter a contagem de linhas da tabela usando
cursor.fetchone()
e, em seguida, tomando a coluna final: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]
Agora
count
conterá o número de linhas na tabela. Você pode usar row[:-1]
para se referir aos dados da linha. Isso pode retardar a consulta porque um
SELECT COUNT(*)
possivelmente caro será executado, mas uma vez concluído, a recuperação dos dados deve ser rápida.