Обновление Oracle XE с 11g до 21c нарушило способность django общаться с TNS Listener
У меня есть старое приложение, которое работает под управлением django 1.10 с бэкэндом oracle XE 11g. Мы пытаемся обновить XE до 21c.
Проблема в том, что django не может найти слушателя TNS, хотя он есть и запущен. sqlplus работает правильно, так что проблема не в самом слушателе.
Приложение django и база данных XE работают на одном сервере, поэтому нет никаких сетевых проблем.
Основное изменение, насколько я могу судить, между 11g и 21c заключается в том, что в новой базе данных oracle есть подключаемые базы данных, и к ним нужно обращаться через механизм именования easy connect. Поддерживается ли это в django 1.10?
Прямое использование cx_Oracle для подключения к базе данных из python3 также работает без ошибок.
Любые указатели приветствуются.
Наконец-то нашел проблему:
У меня были prod.py и dev.py в настройках, и поскольку я вызывал только prod.py, я не заметил, что dev.py все еще имеет старую, не PDB адресацию в определении DATABASES. Обычно оба эти определения идентичны. Все изменения, которые я тестировал в prod, были молча отменены.
Нашел проблему, поместив операторы печати в
/home/raxak/.virtualenvs//lib/python3.6/site-packages/django/db/backends/oracle/base.py
непосредственно перед оператором Database.connect(...) в get_new_connection(...), чтобы увидеть, с чем он пытается соединиться.
Конечное определение DATABASES, которое сработало, было следующим:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME' : '127.0.0.1:1521/XEPDB1',
'PORT' : '',
'HOST' : '',
'USER' : <username>,
'PASSWORD' : <password>,
'CONN_MAX_AGE' : None,
'OPTIONS' : {
'threaded' : True,
}
}
Спасибо всем, кто помогал, особенно Кристоферу Джонсу,