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