Как определить Oracle Instant Client в проекте Django?

Я пытаюсь связать внешнюю базу данных Oracle, на которой у меня есть привилегии только для чтения, с моим проектом Django и затем отправлять ей только необработанные SQL-запросы.

Сначала я создал вторую таблицу в настройках проекта (потому что мне все еще нужна база данных по умолчанию)

settings.py

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': BASE_DIR / 'db.sqlite3',
},
'oracleDB':{
    'ENGINE': 'django.db.backends.oracle',
    'NAME': 'my_dsn',
    'USER': 'my_user',
    'PASSWORD': 'my_password',
    'HOST': 'my_host',
    'PORT': 'my_port',
    'OPTIONS':{
        'threaded':True
    }
}

Тогда на мой взгляд, я называю это так (видел на форуме):

views.py

from django.db import connections
def my_function(request):
    with connections['oracleDB'].cursor() as cur:
        cur.execute( "SOME SQL QUERY")
        print(cur.fetchall())

И я получаю эту ошибку

DPI-1047: Cannot locate a 64-bit Oracle Client library: "C: ProgramData Oracle12c product 12.1.0 client_1 bin oci.dll не соответствует правильная архитектура". См. cx_Oracle 8 Installation - cx_Oracle 8.3.0 документацию для справки

Я знаю, что мне нужен Oracle instantclient для подключения, я использовал его для подключения с пакетом cx_Oracle и он работал хорошо (поэтому я уверен, что версия хорошая). Только вот теперь я подключаюсь с помощью Django и его настроек, где я не могу указать путь к моему Oracle instantclient.

У вас есть идеи, как включить Django для обнаружения этого клиента?

Я использую Windows 10 64bits.

Заранее спасибо, пожалуйста, не стесняйтесь попросить меня разработать

  • Похоже, что у вас могут быть установлены несколько версий библиотек Oracle. Как вы обнаружили, вам необходимо убедиться, что 64-битный набор библиотек Oracle Client доступен для Python. Или в качестве альтернативы используйте 32-битный исполняемый файл Python.

  • Если у вас уже установлены библиотеки на этой машине (поскольку вы говорите, что можете использовать cx_Oracle напрямую), то в вашем файле Django settings.py добавьте вызов cx_Oracle.init_oracle_client(lib_dir=r"\path\to\instantclient"). (Эта техника также работает на macOS, но не на Linux)

  • В качестве альтернативы используйте новую мажорную версию cx_Oracle - которая была переименована в python-oracledb, смотрите объявление о выпуске . Ему не нужны библиотеки Oracle Client. См. этот пост.

Все в порядке, я решил свою проблему, добавив

settings.py

import cx_Oracle
cx_Oracle.init_oracle_client(lib_dir="my_path_to_oracle_client")
 
DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': BASE_DIR / 'db.sqlite3',
        },
        'oracleDB':{
            'ENGINE':'django.db.backends.oracle',
            'NAME':(
                '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=my_host)(PORT=my_port))'
                '(CONNECT_DATA=(SERVICE_NAME=my_service)))'
            ),
            'USER':'my_user',
            'PASSWORD':'my_password',
        }

Поэтому я добавил инициализацию клиента cx_Oracle непосредственно в настройках Django и изменил свой NAME, который не позволял распознать базу данных до этого.

Для запроса базы я делаю так:

views.py

from django.db import connections
 
with connections['oracleDB'].cursor() as cur:
        cur.execute("""MY_SQL_QUERY""")

Не стесняйтесь, если вы думаете, что у вас есть лучшее решение.

Спасибо за помощь

Вернуться на верх