Невозможно выбрать базу данных для запросов к базе данных в django

Я пытаюсь направить запросы на чтение на мою реплику чтения в производственной установке. Django позволяет определять несколько баз данных, поэтому я добавил две базы данных следующим образом:

DATABASES = {
    "default": {
        "NAME": "ironbank",
        "ENGINE": "django_postgrespool2",
        "USER": "postgres",
        "PASSWORD": os.getenv("DATABASE_PASSWORD", "postgres"),
        "HOST": os.getenv("DATABASE_HOST", "localhost"),
        "PORT": os.getenv("DATABASE_PORT", "5432"),
        "CONN_MAX_AGE": 0,
    },
    "replica": {
        "NAME": "ironbank_replica",
        "ENGINE": "django_postgrespool2",
        "USER": "postgres",
        "PASSWORD": os.getenv("DATABASE_PASSWORD", "postgres"),
        "HOST": os.getenv("REPLICA_DATABASE_HOST", "localhost"),
        "PORT": os.getenv("REPLICA_DATABASE_PORT", "5432"),
        "TEST": {
            "MIRROR": "default",
        },
        "CONN_MAX_AGE": 0,
    },
}

Здесь я использую две разные базы данных, чтобы протестировать их локальную настройку.

У меня также есть маршрутизатор базы данных, настроенный как

file: settings.py
DATABASE_ROUTERS = ["ironbank.router.PrimaryReplicaRouter"]
---
file: ironbank/router/PrimaryReplicaRouter.py
class PrimaryReplicaRouter:
    @staticmethod
    def db_for_read(model, **hints):
        """
        Reads go to a randomly-chosen replica.
        """
        # some model specific logic here, but removed for simplicity
        return "replica"

    @staticmethod
    def db_for_write(model, **hints):
        """
        Writes always go to primary.
        """
        return "default"

    @staticmethod
    def allow_relation(obj1, obj2, **hints):
        """
        Relations between objects are allowed if both objects are
        in the primary/replica pool.
        """
        return True

    @staticmethod
    def allow_migrate(db, app_label, model_name=None, **hints):
        """
        Allow migrations on default database only.
        """
        return db == "default"

Находки

  • Я использовал shell_plus и ручную проверку данных для проверки того, что результат, возвращаемый запросом, получен от мастера или реплики. shell_plus напрямую показывает базу данных по умолчанию, используемую для всех запросов. Выполнение ручных запросов также подтвердило, что данные поступают от мастера.
  • Я подозреваю, что django не учитывает конфигурацию DATABASE_ROUTERS, так как я заполнил случайную строку и не получил ошибки при выполнении запроса к базе данных.
  • Даже синтаксическая ошибка в определении класса говорит о том, что django не читал класс.
  • Версия Django - 3.2, которая поддерживает конфигурацию.
  • Использование .using("replica") также не помогло. Согласно документации, он переопределяет определение маршрутизатора базы данных, а это тоже не работает
  • .
Вернуться на верх