PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Contagem de linhas psycopg2 para cursor do lado do servidor


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.