У меня есть несколько приложений с разными подключениями к базе данных. Все они работают нормально.
Моему новому приложению требуется соединение с Oracle, настроенное в settings.py
:
'database_oracle' : {
'ENGINE' : 'oracle',
'NAME' : 'name',
'USER' : 'user',
'PASSWORD' : 'pw',
'HOST' : 'connection',
'PORT' : 1234,
'SCHMEA' : 'abc',
},
Модели в моем models.py
имеют дополнительные мета-классы:
class Meta:
db_table = '"abc.table1"'
data_source = 'database_oracle'
data_source_app = 'myapp'
Проблема в том, что
Model1.objects.all()
возвращает ошибку: `
django.db.utils.DatabaseError: ORA-00942: таблица или представление не существует
Но если я использую соединение django.db
:
from django.db import connections
db_conn = connections['database_oracle']
c = db_conn.cursor()
c.execute("SELECT MAX(date) FROM abc.table1 WHERE key = 1234567").fetchall()
Работает отлично.
Поэтому я попробовал разные варианты написания для db_table:
db_table = 'table1'
db_table = '"table1"'
db_table = 'abc.table1'
db_table = '"abc.table1"'
Изменения были перенесены каждый раз, и вот как выглядит мой routers.py
(операторы if принадлежат другим приложениям и другим базам данных):
myapps = ['myapp']
class DataRouter:
def db_for_read(self, model, **hints):
if [...]
elif model._meta.app_label in myapps:
return 'database_oracle'
return None
def db_for_write(self,model, **hints):
if [...]
elif model._meta.app_label in myapps:
return 'database_oracle'
return None
def allow_relation(self, obj1, obj2, **hints):
if [...]
elif obj1._meta.app_label in myapps or obj2._meta.app_label in myapps:
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
if [...]
elif app_label in myapps:
return db =='database_oracle'
return None
Кто-нибудь знает, почему модели не могут подключиться к моей базе данных?