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

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

3 Solutions collect form web for “cx_Oracle: Как перебирать результирующий набор?”

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

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

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

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

  • создание временной таблицы из запроса с использованием sqlalchemy orm
  • Отображение дерева из таблицы закрытия инструкции SELECT?
  • Отключить обнаружение SQL в JetBrains PyCharm
  • Лучший способ разбивать необработанный SQL-запрос в представлении списка Django REST ListAPI?
  • Подсчет отношений в SQLAlchemy
  • Google App Engine: введение в свой API хранилища данных для людей с фона SQL?
  • Есть ли в Python модуль, который делает что-то вроде «sqldf» для R?
  • Как смоделировать отношение «многие ко многим» в трех таблицах в SQLAlchemy (ORM)?
  •  
    Interesting Posts for Van-Lav

    Таблицы Django 2: ошибка django.template.context_processors.request

    matplotlib: 2 разных легенды на одном графике

    Установка Lpsolve в Python27

    как сохранить структуру словаря

    Python HTML в PDF с полной поддержкой CSS3 и HTML5

    Преобразование даты и времени Python и utc без учета часового пояса / летнего времени

    sqlite3 для чтения только в файловой системе, которая не поддерживает блокировку

    Число фиксированных цифр в поплавках

    Почему PyCharm дает нерешенные справочные ошибки в отношении некоторых импортных операций Numpy?

    Какой протокол следует использовать для потоковой передачи аудио (не вживую)?

    поиск значений до и после в длинном отсортированном списке

    Печать на стандартный принтер с Python?

    django 1.4 как автоматически получить часовой пояс пользователя от клиента

    Как запустить новый файл Jupyter Notebook, который не является частью предварительно созданного изображения докеров в докере?

    Какой размер Clyther над головой?

    Python - лучший язык программирования в мире.