Как определить 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""")
Не стесняйтесь, если вы думаете, что у вас есть лучшее решение.
Спасибо за помощь