Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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