Psycopg2 heeft een mooie interface voor het werken met server-side cursors. Dit is een mogelijke sjabloon om te gebruiken:
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
De bovenstaande code maakt de verbinding en plaatst het queryresultaat automatisch in een cursor aan de serverzijde. De waarde itersize
stelt het aantal rijen in dat de client per keer vanaf de servercursor naar beneden haalt. De waarde die u gebruikt, moet het aantal netwerkoproepen in evenwicht houden met het geheugengebruik op de client. Als uw aantal resultaten bijvoorbeeld drie miljoen is, wordt een itersize
waarde van 2000 (de standaardwaarde) resulteert in 1500 netwerkoproepen. Als het geheugen dat door 2000 rijen wordt verbruikt licht is, verhoogt u dat aantal.
Bij gebruik van for row in cursor
je werkt natuurlijk met één rij tegelijk, maar Psycopg2 zal itersize
prefetchen rijen tegelijk voor u.
Als u fetchmany
wilt gebruiken om de een of andere reden zou je zoiets als dit kunnen doen:
while True:
rows = cursor.fetchmany(100)
if len(rows) > 0:
for row in rows:
# process row
else:
break
Dit gebruik van fetchmany
activeert geen netwerkaanroep naar de server voor meer rijen totdat de vooraf opgehaalde batch is uitgeput. (Dit is een ingewikkeld voorbeeld dat niets boven de bovenstaande code biedt, maar laat zien hoe fetchmany
te gebruiken mocht dat nodig zijn.)