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




lxml parser library python (2)

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

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





cx-oracle