Django - раздельные БД для записи и чтения и проблема с тестами
Я создал отдельные базы данных для операций чтения и для операций записи. В моей среде DEV это указывает на одну и ту же базу данных, но под разными псевдонимами. В среде PROD это переписывается и указывает на 2 отдельные базы данных, которые связаны между собой и содержат в основном одни и те же данные.
Тем не менее, хотя конфигурация работает корректно при использовании моего веб-приложения Django (запуск веб-сервера, игра с логикой через браузер), мои модульные тесты, которые создают/изменяют и затем утверждают изменения в экземплярах моделей, не могут быть запущены вообще. Ошибка, которую я получаю при запуске моих модульных тестов, выглядит следующим образом:
ValueError: Cannot force both insert and updating in model saving.
Моя установка выглядит следующим образом:
settings.py
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": "django",
"USER": "dj",
"PASSWORD": "mypassword",
"HOST": "127.0.0.1",
"PORT": "3306",
},
"read_db": {
"ENGINE": "django.db.backends.mysql",
"NAME": "django",
"USER": "dj",
"PASSWORD": "mypassword",
"HOST": "127.0.0.1",
"PORT": "3306",
},
"write_db": {
"ENGINE": "django.db.backends.mysql",
"NAME": "django",
"USER": "dj",
"PASSWORD": "mypassword",
"HOST": "127.0.0.1",
# localhost because otherwise client is trying to connect via socket instead of TCP IP
"PORT": "3306",
},
"root": {
"ENGINE": "django.db.backends.mysql",
"NAME": "root",
"USER": "xxx",
"PASSWORD": "zzz",
"HOST": "127.0.0.1",
"PORT": "3306",
},
}
DATABASE_ROUTERS = ["config.db_routers.ReadWriteDatabaseRouter"]
db_routers.py
class ReadWriteDatabaseRouter(object):
"""
A database router to control all operations on the read and write databases.
"""
read_db = "read_db"
write_db = "write_db"
def db_for_read(self, model, **hints):
"""Defines the database to be used for read operations."""
return self.read_db
def db_for_write(self, model, **hints):
"""Defines the database to be used for write operations."""
return self.write_db
def allow_relation(self, obj1, obj2, **hints):
"""Relations between objects are allowed if both objects are in the primary/replica pool."""
db_set = {self.read_db, self.write_db}
if obj1._state.db in db_set and obj2._state.db in db_set:
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
"""All models end up in this pool."""
return True
Моя цель - использовать отдельную базу данных для операций записи и отдельную базу данных для операций чтения. Для юнит-тестов или тестирования в целом, мне не важно, создаст ли Django отдельную базу данных SQLite3 или другую базу данных в MySQL, просто она должна работать корректно.
Есть идеи, как я могу решить эту проблему, пожалуйста?
Спасибо