cx_Oracle: Как перебирать результирующий набор?

Существует несколько способов итерации по набору результатов. Каковы компромиссы каждого?

Канонический способ – использовать встроенный итератор курсора.

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 за раз, уменьшая количество сетевых обходов, которые необходимо выполнить

Существует также способ, которым psyco-pg похоже, делает это … Из того, что я собираю, psyco-pg впечатление, что словарные прокси-серверы похожи на словари для сопоставления ключевого поиска в блок памяти, возвращаемый запросом. В этом случае получение всего ответа и работа с подобным прокси-заводом по строкам кажется полезной идеей. Подумайте об этом, но он больше похож на Lua, чем на Python.

Кроме того, это должно быть применимо ко всем интерфейсам PAP-249 DBAPI2.0 , а не только к Oracle, или вы имели в виду просто быстрое использование Oracle ?