Проблемы с настройкой маршрутизатора баз данных в Django для работы с несколькими базами данных
Я работаю над приложением Django, которое использует две базы данных:
- Основная база данных: Эта база данных устанавливается по умолчанию и используется в основном для операций, доступных только для чтения, таких как запросы к аналитическим данных. Она не обрабатывает аутентификацию или какие-либо операции записи.
- Вторичная база данных (
sqlserver_db
): Эта база данных используется для операций записи операций записи, включая миграции и задачи, связанные с аутентификацией. I сталкиваюсь с трудностями при настройке маршрутизатора базы данных в моемsettings.py
, чтобы правильно направлять операции чтения и записи в соответствующую базу данных. Ниже приведена моя текущая настройка:
У меня никак не получается установить маршрутизатор базы данных в файле settings.py
Ниже приведено то, что я сделал в settings.py
:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME': 'AAAA',
'USER': 'AAAA',
'PASSWORD': 'AAAA',
'HOST': 'AAAA',
'PORT': 'AAAA',
'OPTIONS': {
'threaded': True,
},
},
'sqlserver_db': {
'ENGINE': 'mssql',
'NAME': 'AAAA',
'USER': 'AAAA',
'PASSWORD': 'AAAAA',
'HOST': 'AAAAA',
'PORT': '',
'OPTIONS': {
'driver': 'ODBC Driver 17 for SQL Server',
},
}
}
DATABASE_ROUTERS = ['MyApp.routers.AuthRouter']
и там в routers.py
:
class AuthRouter:
"""
A router to control all database operations on models in the
auth and contenttypes applications.
"""
route_app_labels = {"auth", "contenttypes"}
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 "sqlserver_db"
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 "sqlserver_db"
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):
"""
Ensure all migrations apply only to the 'sqlserver_db' database.
"""
if db == "sqlserver_db":
return True # Allow all migrations on 'sqlserver_db'
else:
return False # Prevent migrations on the 'default' database
Несмотря на эту конфигурацию, выполнение python manage.py showmigrations
не приводит к появлению списка миграций для sqlserver_db
, как ожидалось. Однако выполнение python manage.py showmigrations --database=sqlserver_db
показывает, что миграции были применены.
Кроме того, запуск сервера с помощью python manage.py runserver
приводит к предупреждению о 18 непримененных миграциях для таких приложений, как admin, auth, contenttypes и sessions, что говорит о том, что моя конфигурация маршрутизатора может работать не так, как предполагалось.
Вопрос: Как я могу настроить конфигурацию маршрутизатора, чтобы Django правильно определял, где проверять и применять миграции, особенно для моделей аутентификации и contenttype, сохраняя при этом базу данных по умолчанию только для чтения аналитических данных?
Примечание : для выполнения migrations
мне пришлось сделать python manage.py migrate --database=sqlserver_db, потому что иначе он пытается попасть не в ту базу данных (default
одну).