Есть несколько способов перебора набора результатов. Каковы компромиссы каждого?
Каноническим способом является использование встроенного курсора итератора.
curs.execute('select * from people')
for row in curs:
print row
Вы можете использовать, fetchall()
чтобы получить все строки одновременно.
for row in curs.fetchall():
print row
Это может быть удобно использовать для создания списка Python, содержащего возвращаемые значения:
curs.execute('select first_name from people')
names = [row[0] for row in curs.fetchall()]
Это может быть полезно для небольших наборов результатов, но может иметь плохие побочные эффекты, если набор результатов большой.
Вам нужно подождать, пока весь набор результатов будет возвращен вашему клиентскому процессу.
Вы можете съесть много памяти в вашем клиенте для хранения встроенного списка.
Python может занять некоторое время для создания и деконструкции списка, который вы в любом случае немедленно откажетесь.
Если вы знаете, что в наборе результатов возвращается одна строка, вы можете позвонить, fetchone()
чтобы получить одну строку.
curs.execute('select max(x) from t')
maxValue = curs.fetchone()[0]
Наконец, вы можете зацикливаться на наборе результатов, выбирая по одной строке за раз. В общем, нет особого преимущества в этом по сравнению с использованием итератора.
row = curs.fetchone()
while row:
print row
row = curs.fetchone()
Мой предпочтительный путь - итератор курсора, но сначала нужно установить свойство arraysize курсора.
curs.execute('select * from people')
curs.arraysize = 256
for row in curs:
print row
В этом примере cx_Oracle будет извлекать строки из Oracle 256 строк одновременно, уменьшая количество сетевых обходов, которые необходимо выполнить
execute
вызова. psyco-pg
Кажется, есть и способ сделать это ... Из того, что я понял, похоже, создается словарь-прокси строк для сопоставления поиска ключа с блоком памяти, возвращаемым запросом. В этом случае получение полного ответа и работа с аналогичной фабрикой прокси по строкам кажется полезной идеей. Если подумать, это похоже на Lua, а не на Python.
Кроме того, это должно быть применимо ко всем интерфейсам DBAPI2.0 PEP-249 , а не только к Oracle, или вы имели в виду просто самое быстрое использование Oracle ?