Psycopg2 tem uma interface agradável para trabalhar com cursores do lado do servidor. Este é um modelo possível de usar:
with psycopg2.connect(database_connection_string) as conn:
with conn.cursor(name='name_of_cursor') as cursor:
cursor.itersize = 20000
query = "SELECT * FROM ..."
cursor.execute(query)
for row in cursor:
# process row
O código acima cria a conexão e coloca automaticamente o resultado da consulta em um cursor do lado do servidor. O valor
itersize
define o número de linhas que o cliente puxará para baixo por vez a partir do cursor do lado do servidor. O valor que você usa deve equilibrar o número de chamadas de rede versus o uso de memória no cliente. Por exemplo, se sua contagem de resultados for três milhões, um itersize
valor de 2000 (o valor padrão) resultará em 1500 chamadas de rede. Se a memória consumida por 2.000 linhas for leve, aumente esse número. Ao usar
for row in cursor
é claro que você está trabalhando com uma linha de cada vez, mas o Psycopg2 irá pré-buscar itersize
linhas de cada vez para você. Se você quiser usar
fetchmany
por algum motivo, você poderia fazer algo assim:while True:
rows = cursor.fetchmany(100)
if len(rows) > 0:
for row in rows:
# process row
else:
break
Este uso de
fetchmany
não acionará uma chamada de rede para o servidor para mais linhas até que o lote pré-buscado seja esgotado. (Este é um exemplo complicado que não fornece nada sobre o código acima, mas demonstra como usar fetchmany
caso haja necessidade.)