Существует несколько способов итерации по набору результатов. Каковы компромиссы каждого?
Cx_Oracle: Как перебирать результирующий набор?
Ответ 1
Канонический способ - использовать встроенный итератор курсора.
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()
Ответ 2
Мой предпочтительный путь - это итератор курсора, но сначала задает свойство arraysize курсора.
curs.execute('select * from people')
curs.arraysize = 256
for row in curs:
print row
В этом примере cx_Oracle будет извлекать строки из Oracle 256 строк за раз, уменьшая количество сетевых обходов, которые необходимо выполнить
Ответ 3
Также существует способ psyco-pg
сделать это... Из того, что я собираю, создается впечатление, что словарные прокси-серверы, подобные словарю, сопоставляют поиск ключей в блок памяти, возвращаемый запросом. В этом случае получение целого ответа и работа с подобным прокси-сервером factory по строкам кажется полезной идеей. Подумайте об этом, но он больше похож на Lua, чем на Python.
Кроме того, это должно быть применимо ко всем PEP-249 DBAPI2.0 интерфейсам, а не только к Oracle, или вы имели в виду только самое быстрое использование Oracle?