PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come utilizzare i cursori lato server con psycopg2

Psycopg2 ha una bella interfaccia per lavorare con i cursori lato server. Questo è un possibile modello da utilizzare:

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 

Il codice sopra crea la connessione e inserisce automaticamente il risultato della query in un cursore lato server. Il valore itersize imposta il numero di righe che il client tirerà giù alla volta dal cursore lato server. Il valore utilizzato dovrebbe bilanciare il numero di chiamate di rete rispetto all'utilizzo della memoria sul client. Ad esempio, se il conteggio dei risultati è tre milioni, un itersize il valore di 2000 (il valore predefinito) risulterà in 1500 chiamate di rete. Se la memoria consumata da 2000 righe è leggera, aumenta quel numero.

Quando si utilizza for row in cursor ovviamente stai lavorando con una riga alla volta, ma Psycopg2 preleverà itersize righe alla volta per te.

Se vuoi usare fetchmany per qualche motivo, potresti fare qualcosa del genere:

while True:
    rows = cursor.fetchmany(100)
    if len(rows) > 0:
        for row in rows:
            # process row
    else:
        break

Questo utilizzo di fetchmany non attiverà una chiamata di rete al server per più righe fino a quando il batch precaricato non sarà esaurito. (Questo è un esempio contorto che non fornisce nulla rispetto al codice sopra, ma mostra come usare fetchmany se ce ne fosse bisogno.)