Psycopg2 har en fin grænseflade til at arbejde med markører på serversiden. Dette er en mulig skabelon at bruge:
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 ovenfor opretter forbindelsen og placerer automatisk forespørgselsresultatet i en markør på serversiden. Værdien itersize
indstiller antallet af rækker, som klienten vil trække ned ad gangen fra markøren på serversiden. Den værdi, du bruger, skal balancere antallet af netværksopkald i forhold til hukommelsesforbrug på klienten. For eksempel, hvis dit resultatantal er tre millioner, en itersize
værdi på 2000 (standardværdien) vil resultere i 1500 netværksopkald. Hvis hukommelsen, der forbruges af 2000 rækker, er lav, skal du øge dette tal.
Når du bruger for row in cursor
du arbejder selvfølgelig med en række ad gangen, men Psycopg2 vil forhåndshente itersize
rækker ad gangen til dig.
Hvis du vil bruge fetchmany
af en eller anden grund kan du gøre sådan noget:
while True:
rows = cursor.fetchmany(100)
if len(rows) > 0:
for row in rows:
# process row
else:
break
Denne brug af fetchmany
vil ikke udløse et netværkskald til serveren for flere rækker, før den forudhentede batch er opbrugt. (Dette er et indviklet eksempel, der ikke giver noget ud over koden ovenfor, men viser, hvordan man bruger fetchmany
hvis der skulle være behov.)