Проблемы с настройкой маршрутизатора баз данных в Django для работы с несколькими базами данных

Я работаю над приложением Django, которое использует две базы данных:

  1. Основная база данных: Эта база данных устанавливается по умолчанию и используется в основном для операций, доступных только для чтения, таких как запросы к аналитическим данных. Она не обрабатывает аутентификацию или какие-либо операции записи.
  2. Вторичная база данных (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 одну).

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