Psycopg2 má pěkné rozhraní pro práci s kurzory na straně serveru. Toto je možná šablona, kterou lze použít:
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
Výše uvedený kód vytvoří připojení a automaticky umístí výsledek dotazu do kurzoru na straně serveru. Hodnota itersize
nastavuje počet řádků, které klient najednou stáhne dolů z kurzoru na straně serveru. Hodnota, kterou použijete, by měla vyvážit počet síťových volání a využití paměti na klientovi. Pokud jsou například vaše výsledky tři miliony, itersize
hodnota 2000 (výchozí hodnota) bude mít za následek 1500 síťových volání. Pokud je paměť spotřebovaná 2000 řádky slabá, zvyšte toto číslo.
Při použití for row in cursor
samozřejmě pracujete s jedním řádkem najednou, ale Psycopg2 předem načte itersize
řádků najednou pro vás.
Pokud chcete použít fetchmany
z nějakého důvodu můžete udělat něco takového:
while True:
rows = cursor.fetchmany(100)
if len(rows) > 0:
for row in rows:
# process row
else:
break
Toto použití fetchmany
nespustí síťové volání na server pro další řádky, dokud nebude vyčerpána předem načtená dávka. (Toto je spletitý příklad, který neposkytuje nic nad kódem výše, ale ukazuje, jak používat fetchmany
měla by být potřeba.)