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.