Django.db.utils.DatabaseError: DPY-4027: нет каталога конфигурации для поиска tnsnames.ora в моем докеризованном приложении django
Я тщетно пытаюсь соединить мое приложение django с базой данных oracle.
Я добавил переменную окружения TNS_ADMIN, но проблема сохраняется.
Вот содержимое моего файла tnsnames.ora:
# tnsnames.ora Network Configuration File: C:\app\HP\product\21c\homes\OraDB21Home1\NETWORK\ADMIN\tnsnames.ora
# Generated by Oracle configuration tools.
XE =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = xxx)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = XE)
)
)
LISTENER_XE =
(ADDRESS = (PROTOCOL = TCP)(HOST = xxx)(PORT = 1521))
ORACLR_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
(CONNECT_DATA =
(SID = CLRExtProc)
(PRESENTATION = RO)
)
)
Следует отметить, что я использую SQL developer.
Моя конфигурация базы данных в django:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME': os.environ.get("DB_NAME"),
'USER': os.environ.get("DB_USER"),
'HOST': os.environ.get("DB_HOST"),
'POSRT': os.environ.get("DB_PORT"),
'PASSWORD': os.environ.get("DB_PASS")
}
}
Файл docker-compose.yml:
version: '3'
services:
backend:
container_name: bdr-backend
build:
context: .
command: >
sh -c "python manage.py makemigrations --noinput &&
python manage.py migrate --noinput &&
python manage.py runserver 0.0.0.0:8000"
ports:
- 8000:8000
volumes:
- ./backend:/backend
env_file:
- .env
environment:
- DEBUG=1
- DB_HOST=${DB_HOST}
- DB_NAME=${DB_NAME}
- DB_USER=${DB_USER}
- DB_PASS=${DB_PASS}
depends_on:
- redis
redis:
image: redis:7.0.5-alpine
container_name: redis2
expose:
- 6379
Я использую docker docker desktop на windows 10.
Как решить эту проблему?
Используйте синтаксис строки подключения Easy Connect. Установите значение settings.py
"NAME" равным this.
Пример конфигурационного файла settings.py
будет выглядеть так:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME': 'xxxx:1521/xe',
'USER': 'scott',
'PASSWORD': 'topSecret'
}
}
В качестве xxxx
будет использоваться ваше отредактированное имя хоста, или, возможно, 'localhost'. При таком синтаксисе вам не нужен файл tnsnames.ora и не нужно устанавливать переменную окружения TNS_ADMIN.
Django отдает предпочтение использованию python-oracledb. Если python-oracledb не найден, то будет использоваться cx_Oracle. Настройки одинаковы для новых и старых драйверов.
См. Django 5.0 поддерживает python-oracledb нативно и Using python-oracledb 1.0 with SQLAlchemy, Pandas, Django and Flask.
Также планируется обновление с 21x XE до 23ai Free, который можно получить на странице Oracle Database Software Downloads.