Как мне получить доступ к 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.

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


person user425194    schedule 19.08.2010    source источник
comment
Какой cx_Oracle скачали? Их много. Кроме того, какую версию Python, какую версию Oracle и какую операционную систему вы используете?   -  person Bill the Lizard    schedule 19.08.2010
comment
cx_Oracle-5.0.2-10g.win32-py26   -  person user425194    schedule 19.08.2010
comment
Похоже, он не может быть извлечен в PATH, который python использует для поиска модулей. Вы пытались установить его с помощью easy_install, а не явно (может отсутствовать другая зависимость).   -  person JulesLt    schedule 19.08.2010
comment
эта конкретная ошибка означает, что DDL OCI клиента Oracle скомпилированы для другой платформы. 32 бит против 64 или Intel против AMD.   -  person Alex B    schedule 30.05.2018


Ответы (9)


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

Мои версии:

  • Python 2.7
  • Мгновенный клиент Oracle 11G R2
  • cx_Oracle 5.0.4 (Юникод, Python 2.7, Oracle 11G)
  • Windows XP с пакетом обновления 3 (SP3)

Шаги:

  1. Загрузите пакет Oracle Instant Client. Я использовал Instantclient-basic-win32-11.2.0.1.0.zip. Разархивируйте его в C: \ ваш \ путь \ to \ instantclient_11_2
  2. Загрузите и запустите двоичный установщик cx_Oracle. Я использовал cx_Oracle-5.0.4-11g-unicode.win32-py2.7.msi. Я установил его для всех пользователей и указал на то место Python 2.7, которое он нашел в реестре.
  3. Задайте переменные среды ORACLE_HOME и PATH с помощью пакетного сценария или любого другого механизма, который имеет смысл в контексте вашего приложения, чтобы они указывали на каталог Oracle Instant Client. См. Исходный код oracle_python.bat ниже. Я уверен, что для этого должно быть более элегантное решение, но я хотел максимально ограничить общесистемные изменения. Убедитесь, что вы поместили целевой каталог Oracle Instant Client в начало PATH (или, по крайней мере, перед любыми другими каталогами клиентов Oracle). Прямо сейчас я занимаюсь только командной строкой, поэтому я просто запускаю oracle_python.bat в оболочке перед запуском любых программ, требующих cx_Oracle.
  4. Запустите regedit и проверьте, установлен ли ключ NLS_LANG в \ HKEY_LOCAL_MACHINE \ SOFTWARE \ ORACLE. Если да, переименуйте ключ (я изменил его на NLS_LANG_OLD) или снимите его. Этот ключ следует использовать только как значение NLS_LANG по умолчанию для клиента Oracle 7, поэтому его можно безопасно удалить, если только вы не используете клиент Oracle 7 где-то еще. Как всегда, не забудьте сделать резервную копию реестра перед внесением изменений.
  5. Теперь у вас должна быть возможность импортировать 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/password@host: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 или строка» - если вам нужно установить строку SQL в Unicode.
  • «ImportError: Ошибка загрузки DLL: указанная процедура не может быть найдена». - может указывать на то, что cx_Oracle не может найти соответствующую клиентскую DLL Oracle.
person Devon Biere    schedule 24.01.2011
comment
Кто-нибудь знает, работает ли это с другими версиями (например, 3.4? И 64 бит), если все номера версий и платформы выровнены? - person The Red Pea; 10.07.2015
comment
@TheRedPea У меня это сработало для версии 3.5 и 64 бит. - person Abdul; 30.06.2016
comment
Я все еще борюсь с ImportError: DLL load failed: The specified procedure could not be found., пока пытаюсь импортировать библиотеку cx_Oracle. - person Akshay; 23.02.2017
comment
Спасибо за подробные заметки. Очень полезно!! Насколько я понимаю, мне нужно установить клиент Oracle, прежде чем я установлю cx_oracle и подключусь к базе данных. Я пытаюсь подключиться к Oracle db в нашем корпоративном кластере со своего компьютера, но не могу установить cx_oracle, появляется это сообщение об ошибке: distutils.errors.DistutilsSetupError: не удается найти установку программного обеспечения Oracle. - person Abhi; 07.06.2017
comment
Мне действительно нужен клиент Oracle, чтобы это работало? Разве не так просто, как прямое соединение JDBC? Ty. - person Alex Pi; 31.01.2018

Вот как выглядит мой код. Он также показывает пример того, как использовать параметры запроса с помощью словаря. Он работает с использованием Python 3.6:

import cx_Oracle

CONN_INFO = {
    'host': 'xxx.xx.xxx.x',
    'port': 12345,
    'user': 'SOME_SCHEMA',
    'psw': 'SECRETE',
    'service': 'service.server.com'
}

CONN_STR = '{user}/{psw}@{host}:{port}/{service}'.format(**CONN_INFO)

QUERY = '''
    SELECT
        *
    FROM
        USER
    WHERE
        NAME = :name
'''


class DB:
    def __init__(self):
        self.conn = cx_Oracle.connect(CONN_STR)

    def query(self, query, params=None):
        cursor = self.conn.cursor()
        result = cursor.execute(query, params).fetchall()
        cursor.close()
        return result


db = DB()
result = db.query(QUERY, {'name': 'happy'})
person Vlad Bezden    schedule 23.03.2018

Вы можете использовать любой из следующих способов в зависимости от Service Name или SID того, что у вас есть.

С SID:

import cx_Oracle
dsn_tns = cx_Oracle.makedsn('server', 'port', 'sid')
conn = cx_Oracle.connect(user='username', password='password', dsn=dsn_tns)
c = conn.cursor()
c.execute('select count(*) from TABLE_NAME')
for row in c:
   print(row)
conn.close()

ИЛИ

С названием службы:

import cx_Oracle
dsn_tns = cx_Oracle.makedsn('server', 'port', service_name='service_name')
conn = cx_Oracle.connect(user='username', password='password', dsn=dsn_tns)
c = conn.cursor()
c.execute('select count(*) from TABLE_NAME')
for row in c:
   print(row)
conn.close()
person Sahil Chhabra    schedule 10.11.2018

Обратите внимание, если вы используете pandas, вы можете получить к нему доступ следующим образом:

import pandas as pd
import cx_Oracle
conn= cx_Oracle.connect('username/pwd@host:port/service_name')
try:
    query = '''
         SELECT * from dual
             '''
    df = pd.read_sql(con = conn, sql = query)
finally:
    conn.close()
df.head()
person sushmit    schedule 15.08.2018

import cx_Oracle
   dsn_tns = cx_Oracle.makedsn('host', 'port', service_name='give service name') 
   conn = cx_Oracle.connect(user='username', password='password', dsn=dsn_tns) 
   c = conn.cursor()
   c.execute('select count(*) from schema.table_name')
for row in c:
   print row
conn.close()

Примечание :

  1. В (dsn_tns), если необходимо, поместите 'r' перед любым параметром для адресации любого специального символа, такого как '\'.

  2. В (conn), если необходимо, поместите 'r' перед любым параметром для адресации любого специального символа, такого как '\'. Например, если ваше имя пользователя содержит '\', вам нужно поставить 'r' перед именем пользователя: user = r'User Name 'или password = r'password'

  3. используйте тройные кавычки, если хотите распределить запрос по нескольким строкам.

person Siraj    schedule 05.11.2018

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

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

person Mike    schedule 16.03.2012

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

person TML    schedule 19.08.2010

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

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

Исправляет эту проблему на окнах как шарм.

person Venu Murthy    schedule 26.04.2013
comment
это не было намеренно, хотя я не знаю, как это произошло. - person Venu Murthy; 25.06.2013

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

person Ward    schedule 02.04.2015