cx_Oracle: Как перебрать набор результатов?

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

Ответов (3)

Решение

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

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()

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

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

Я предпочитаю использовать итератор курсора, но сначала устанавливаю свойство arrayysize курсора.

curs.execute('select * from people')
curs.arraysize = 256
for row in curs:
    print row

В этом примере cx_Oracle будет извлекать строки из Oracle 256 строк за раз, уменьшая количество сетевых циклов, которые необходимо выполнить.