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

Как я могу получить доступ к Oracle из Python?

Как я могу получить доступ к Oracle из Python? Я загрузил установщик cx_Oracle msi, но Python не может импортировать библиотеку.

Я получаю следующую ошибку:

import cx_Oracle

Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    import cx_Oracle
ImportError: DLL load failed: The specified module could not be found.

Буду благодарен за любую помощь.

4b9b3361

Ответ 1

Вот что сработало для меня. Мои версии Python и Oracle немного отличаются от ваших, но должен применяться тот же подход. Просто убедитесь, что версия cx_Oracle для двоичной установки совпадает с версией клиента Oracle и Python.

Мои версии:

  • Python 2.7
  • Oracle Instant Client 11G R2
  • cx_Oracle 5.0.4 (Unicode, Python 2.7, Oracle 11G)
  • Windows XP SP3

Шаги:

  • Загрузите пакет Oracle Instant Client. Я использовал instantclient-basic-win32-11.2.0.1.0.zip. Разархивируйте его в папку C:\your\path\to\instantclient_11_2
  • Загрузите и запустите установщик cx_Oracle. Я использовал cx_Oracle-5.0.4-11g-unicode.win32-py2.7.msi. Я установил его для всех пользователей и указал на его расположение в Python 2.7, найденное в реестре.
  • Установите переменные среды ORACLE_HOME и PATH через пакетный script или какой-либо механизм имеет смысл в контексте вашего приложения, чтобы они указывали на каталог Oracle Instant Client. См. Источник oracle_python.bat ниже. Я уверен, что для этого должно быть более элегантное решение, но я хотел как можно больше ограничить свои общесистемные изменения. Убедитесь, что вы разместили целевой каталог Oracle Instant Client в начале PATH (или, по крайней мере, опережаете любые другие клиентские каталоги Oracle). Прямо сейчас я занимаюсь только командами, поэтому я запускаю oracle_python.bat в оболочке перед запуском любых программ, для которых требуется cx_Oracle.
  • Запустите regedit и проверьте, есть ли ключ NLS_LANG в \HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE. Если это так, переименуйте ключ (я изменил его на NLS_LANG_OLD) или отменил его. Этот ключ должен использоваться только как значение NLS_LANG по умолчанию для клиента Oracle 7, поэтому его можно безопасно удалить, если вы не используете клиент Oracle 7 где-то в другом месте. Как всегда, перед внесением изменений обязательно создайте резервную копию реестра.
  • Теперь вы можете импортировать cx_Oracle в свою программу Python. См. Источник oracle_test.py ниже. Обратите внимание, что мне пришлось установить соединение и строки SQL в Unicode для моей версии cx_Oracle.

Источник: oracle_python.bat

@echo off
set ORACLE_HOME=C:\your\path\to\instantclient_11_2
set PATH=%ORACLE_HOME%;%PATH%

Источник: oracle_test.py

import cx_Oracle

conn_str = u'user/[email protected]:port/service'
conn = cx_Oracle.connect(conn_str)
c = conn.cursor()
c.execute(u'select your_col_1, your_col_2 from your_table')
for row in c:
    print row[0], "-", row[1]
conn.close()

Возможные проблемы:

  • "ORA-12705: не удается получить доступ к файлам данных NLS или недействительной заданной среде" - я столкнулся с этим до того, как изменил реестр NLS_LANG.
  • "TypeError: аргумент 1 должен быть unicode, а не str" - если вам нужно установить строку подключения в Unicode.
  • "TypeError: ожидать None или string" - если вам нужно установить строку SQL в Unicode.
  • "ImportError: Ошибка загрузки DLL: указанная процедура не найдена." - может указывать на то, что cx_Oracle не может найти соответствующую DLL-клиент Oracle.

Ответ 2

В дополнение к мгновенному клиенту Oracle вам также может потребоваться установить компоненты Oracle ODAC и поместить путь к ним в ваш системный путь. cx_Oracle, похоже, нуждается в доступе к файлу oci.dll, который установлен с ними.

Также убедитесь, что вы получили правильную версию (32-битную или 64-битную) из них, которая соответствует вашим: версиям python, cx_Oracle и мгновенного клиента.

Ответ 3

В дополнение к cx_Oracle вам необходимо установить клиентскую библиотеку Oracle и установить правильные пути для того, чтобы cx_Oracle нашел ее - попробуйте открыть библиотеку cx_Oracle в "Dependency Walker" (http://www.dependencywalker.com/), чтобы узнать, что представляет собой недостающая DLL.

Ответ 4

Если вы используете virtualenv, это не так тривиально, чтобы получить драйвер, используя установщик. Что вы можете сделать тогда: установите его, как описано Devon. Затем скопируйте cx_Oracle.pyd и папку cx_Oracle-XXX.egg-info из пакетов Python\Lib\site-packages в Lib\site-пакеты из вашего виртуального env. Конечно, здесь также важны архитектура и версия.

Ответ 5

Обеспечьте эти два, и они должны работать: -

  • Python, Oracle instantclient и cx_Oracle - 32 бит.
  • Установите переменные среды.

Устраняет эту проблему в окнах, как прелесть.