Проблема маршрутизации нескольких бд при миграции моделей в Django
Я хочу создать отдельную базу данных для хранения журналов проекта, которые определяют его модели на LogCenter
app. Все остальные таблицы моделей хранятся на default
базе данных. Что-то вроде этого:
+ All models in all apps except LogCenter -> default DB
+ Models of LogCenter app -> log_config DB
Это мой settings.py
:
DATABASE_ROUTERS = ['Core.models.ALLDBRouter', 'Core.models.LogCenterRouter', ]
DATABASES = {
'default': {
'ENGINE': os.environ.get("DEFAULT_DATABASE_ENGINE"),
'NAME': os.environ.get("DEFAULT_DATABASE_NAME"),
'USER': os.environ.get("DEFAULT_DATABASE_USER"),
'PASSWORD': os.environ.get("DEFAULT_DATABASE_PASSWORD"),
'HOST': DEFAULT_DATABASE_HOST,
'PORT': os.environ.get("DEFAULT_DATABASE_PORT"),
# 'OPTIONS': {
# 'options': '-c statement_timeout=30000',
# },
},
'log_config': {
'ENGINE': os.environ.get("LOG_DATABASE_ENGINE"),
'NAME': os.environ.get("LOG_DATABASE_NAME"),
'USER': os.environ.get("LOG_DATABASE_USER"),
'PASSWORD': os.environ.get("LOG_DATABASE_PASSWORD"),
'HOST': LOG_DATABASE_HOST,
'PORT': os.environ.get("LOG_DATABASE_PORT"),
}
}
А это маршрутизаторы моей базы данных:
class LogCenterRouter:
"""
A router to control all database operations on models in the
auth and contenttypes applications.
"""
route_app_labels = {'LogCenter', }
def db_for_read(self, model, **hints):
"""
Attempts to read auth and contenttypes models go to auth_db.
"""
if model._meta.app_label in self.route_app_labels:
return 'log_config'
return None
def db_for_write(self, model, **hints):
"""
Attempts to write auth and contenttypes models go to auth_db.
"""
if model._meta.app_label in self.route_app_labels:
return 'log_config'
return None
def allow_relation(self, obj1, obj2, **hints):
"""
Allow relations if a model in the auth or contenttypes apps is
involved.
"""
if (
obj1._meta.app_label in self.route_app_labels or
obj2._meta.app_label in self.route_app_labels
):
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
"""
Make sure the auth and contenttypes apps only appear in the
'auth_db' database.
"""
if app_label in self.route_app_labels:
return db == 'log_config'
return None
class ALLDBRouter:
"""
A router to control all database operations on models in the
auth and contenttypes applications.
"""
apps = settings.INSTALLED_APPS
apps.remove("LogCenter")
route_app_labels = set(apps)
def db_for_read(self, model, **hints):
"""
Attempts to read auth and contenttypes models go to auth_db.
"""
if model._meta.app_label in self.route_app_labels:
return 'default'
return None
def db_for_write(self, model, **hints):
"""
Attempts to write auth and contenttypes models go to auth_db.
"""
if model._meta.app_label in self.route_app_labels:
return 'default'
return None
def allow_relation(self, obj1, obj2, **hints):
"""
Allow relations if a model in the auth or contenttypes apps is
involved.
"""
if (
obj1._meta.app_label in self.route_app_labels or
obj2._meta.app_label in self.route_app_labels
):
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
"""
Make sure the auth and contenttypes apps only appear in the
'auth_db' database.
"""
if app_label in self.route_app_labels:
return db == 'default'
return None
Когда я делаю миграцию, мои таблицы журналов не создаются, и перенесенные записи LogCenter
попадают в основную базу данных (чего я не хотел).
Как можно решить эту проблему?