Psycopg2 има приятен интерфейс за работа с курсори от страна на сървъра. Това е възможен шаблон за използване:
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
Кодът по-горе създава връзката и автоматично поставя резултата от заявката в курсор от страна на сървъра. Стойността itersize
задава броя на редовете, които клиентът ще изтегли наведнъж от курсора от страната на сървъра. Стойността, която използвате, трябва да балансира броя на мрежовите повиквания спрямо използването на паметта на клиента. Например, ако резултатът ви е три милиона, itersize
стойност 2000 (стойността по подразбиране) ще доведе до 1500 мрежови повиквания. Ако паметта, консумирана от 2000 реда, е малка, увеличете този брой.
Когато използвате for row in cursor
вие, разбира се, работите с един ред наведнъж, но Psycopg2 ще извлече предварително itersize
редове наведнъж за вас.
Ако искате да използвате fetchmany
по някаква причина можете да направите нещо подобно:
while True:
rows = cursor.fetchmany(100)
if len(rows) > 0:
for row in rows:
# process row
else:
break
Това използване на fetchmany
няма да задейства мрежово повикване към сървъра за повече редове, докато предварително изтегленият пакет не бъде изчерпан. (Това е сложен пример, който не предоставя нищо повече от кода по-горе, но демонстрира как да използвате fetchmany
ако има нужда.)