Psycopg2 har ett trevligt gränssnitt för att arbeta med markörer på serversidan. Detta är en möjlig mall att använda:
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
Koden ovan skapar anslutningen och placerar automatiskt frågeresultatet i en markör på serversidan. Värdet itersize
ställer in antalet rader som klienten drar ner åt gången från markören på serversidan. Värdet du använder bör balansera antalet nätverksanrop mot minnesanvändning på klienten. Till exempel, om ditt resultat är tre miljoner, en itersize
värde på 2000 (standardvärdet) kommer att resultera i 1500 nätverkssamtal. Om minnet som förbrukas av 2000 rader är svagt, öka det antalet.
När du använder for row in cursor
du arbetar naturligtvis med en rad i taget, men Psycopg2 kommer att förhämta itersize
rader åt gången för dig.
Om du vill använda fetchmany
av någon anledning kan du göra något så här:
while True:
rows = cursor.fetchmany(100)
if len(rows) > 0:
for row in rows:
# process row
else:
break
Denna användning av fetchmany
kommer inte att utlösa ett nätverksanrop till servern för fler rader förrän den förhämtade batchen har förbrukats. (Detta är ett krystat exempel som inte ger något utöver koden ovan, men som visar hur man använder fetchmany
om det skulle finnas ett behov.)