Как я могу получить доступ к Oracle из Python? - PullRequest
28 голосов
/ 19 августа 2010

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

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

Ответы [ 9 ]

33 голосов
/ 24 января 2011

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

Мои версии:

  • Python 2.7
  • Oracle InstantКлиент 11G R2
  • cx_Oracle 5.0.4 (Unicode, Python 2.7, Oracle 11G)
  • Windows XP SP3

Шаги:

  1. Загрузите пакет Oracle Instant Client.Я использовал instantclient-basic-win32-11.2.0.1.0.zip.Распакуйте его в C: \ your \ path \ 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 ниже.Обратите внимание, что для моей версии cx_Oracle мне пришлось установить соединение и строки SQL в Unicode.

Источник: 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.
7 голосов
/ 23 марта 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'})
3 голосов
/ 16 марта 2012

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

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

2 голосов
/ 10 ноября 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()
2 голосов
/ 02 апреля 2015

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

2 голосов
/ 26 апреля 2013

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

  1. Python, Oracle instantclient и cx_Oracle являются 32-разрядными.
  2. Установить переменные окружения.

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

2 голосов
/ 19 августа 2010

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

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

1 голос
/ 15 августа 2018

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

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...