Psycopg2 ma ładny interfejs do pracy z kursorami po stronie serwera. To jest możliwy szablon do użycia:
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
Powyższy kod tworzy połączenie i automatycznie umieszcza wynik zapytania w kursorze po stronie serwera. Wartość itersize
ustawia liczbę wierszy, które klient wyciągnie jednocześnie z kursora po stronie serwera. Użyta wartość powinna zrównoważyć liczbę wywołań sieciowych w stosunku do użycia pamięci na kliencie. Na przykład, jeśli liczba Twoich wyników wynosi trzy miliony, itersize
wartość 2000 (wartość domyślna) spowoduje 1500 połączeń sieciowych. Jeśli pamięć zajęta przez 2000 wierszy jest niewielka, zwiększ tę liczbę.
Gdy używasz for row in cursor
oczywiście pracujesz z jednym wierszem na raz, ale Psycopg2 pobierze z wyprzedzeniem itersize
rzędy na raz dla Ciebie.
Jeśli chcesz użyć fetchmany
z jakiegoś powodu możesz zrobić coś takiego:
while True:
rows = cursor.fetchmany(100)
if len(rows) > 0:
for row in rows:
# process row
else:
break
To użycie fetchmany
nie wyzwoli wywołania sieciowego do serwera dla większej liczby wierszy, dopóki wstępnie pobrana partia nie zostanie wyczerpana. (Jest to zawiły przykład, który nie zawiera niczego poza powyższym kodem, ale demonstruje, jak używać fetchmany
jeśli zajdzie taka potrzeba).