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

голоса
35

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

Задан 03/08/2008 в 02:15
источник пользователем
На других языках...                            


3 ответов

голоса
35

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

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()
Ответил 03/08/2008 d 02:17
источник пользователем

голоса
21

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

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

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

Ответил 24/09/2008 d 03:51
источник пользователем

голоса
4

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

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

Ответил 24/08/2008 d 18:28
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more