cx_Oracle: Как мне перебрать набор результатов? - PullRequest
39 голосов
/ 03 августа 2008

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

Ответы [ 3 ]

40 голосов
/ 03 августа 2008

Каноническим способом является использование встроенного итератора курсора.

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()
23 голосов
/ 24 сентября 2008

Мой предпочтительный способ - итератор курсора, но сначала нужно установить свойство arraysize курсора.

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

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

5 голосов
/ 24 августа 2008

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

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

...