Сведения о вопросе

Ayrat

16:03, 1st July, 2020

Теги

python   sql   database   oracle   cx-oracle    

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

Просмотров: 586   Ответов: 3

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



  Сведения об ответе

lool

18:03, 1st July, 2020

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

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


  Сведения об ответе

lesha

18:03, 1st July, 2020

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

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

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


  Сведения об ответе

LIZA

18:03, 1st July, 2020

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться