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

Como usar cursores do lado do servidor com psycopg2


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.)