Невозможно выбрать базу данных для запросов к базе данных в 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")
также не помогло. Согласно документации, он переопределяет определение маршрутизатора базы данных, а это тоже не работает .