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.

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