Django: запуск сервера, использующего определенную базу данных из нескольких баз данных
Я пытаюсь создать 2 базы данных в django. Вторая база данных предназначена для тестирования, поэтому эти две базы данных практически имеют одинаковые модели.
Мой вопрос в том, как запустить сервер, используя вторую базу данных.
Шаги, которые я выполнил для настройки баз данных:
- Я создал второе приложение под названием 'testing', так что теперь в корневой папке моего проекта есть приложение
api
(настоящее) иtesting
(приложение, предназначенное для тестовой базы данных). После этого добавил те же модели изapi/models.py
вtesting/models.py
.
- Создал маршрутизатор для первой базы данных и второй базы данных:
class AuthRouter:
route_app_labels = {'auth', 'contenttypes', 'admin', 'sessions'}
def db_for_read(self, model, **hints):
if model._meta.app_label in self.route_app_labels:
return 'default'
return None
def db_for_write(self, model, **hints):
if model._meta.app_label in self.route_app_labels:
return 'default'
return None
def allow_migrate(self, db, app_label, model_name = None, **hints):
if app_label in self.route_app_labels:
return db=='default'
return None
def allow_relation(self, obj1, obj2, **hints):
if (
obj1._meta.app_label in self.route_app_labels or
obj2._meta.app_label in self.route_app_labels
):
return True
return None
class SpotTesting:
route_app_labels = {'spot_testing'}
def db_for_read(self, model, **hints):
if model._meta.app_label == "spot_testing":
return 'test_db'
return None
def db_for_write(self, model, **hints):
if model._meta.app_label == "spot_testing":
return 'test_db'
return None
def allow_relation(self, obj1, obj2, **hints):
"""
Relations between objects are allowed if both objects are
in the primary/replica pool.
"""
db_list = ('primary', 'replica1', 'replica2')
if obj1._state.db == "spot_testing" and obj2._state.db == "spot_testing":
return 'test_db'
return None
def allow_migrate(self, db, app_label, model_name = None, **hints):
if app_label == "spot_testing":
return 'test_db'
return None
- Отредактировано
api/settings.py
:
DATABASE_ROUTERS = [
'api.routers.db_routers.AuthRouter',
'api.routers.TestRouter.SpotTesting',
]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': DBNAME,
'USER': USER,
'PASSWORD': PASSWORD,
'HOST': HOST,
'PORT': PORT,
},
'test_db': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': "spot_db_testing",
'USER': USER,
'PASSWORD': PASSWORD,
'HOST': HOST,
'PORT': PORT,
}
}
- Ran
python manage.py migrate --database=test_db
Вот как выглядит тестовая база данных после миграции. Похоже, что некоторые таблицы, которые django обычно создает, отсутствуют .
Теперь я не уверен, какую команду я должен выполнить, чтобы заставить django runserver
использовать test_db
вместо обычного
В большинстве случаев лучше использовать простые решения, это экономит время. В вашей ситуации вы можете создать детали .env для базы данных, которую вы хотите использовать, и указать учетные данные os.environ, на которые они будут указывать.
'default': {
'ENGINE': os.environ.get(ENGINE, testEngine),
'NAME': os.environ.get(DBNAME, testDBNameDefault),
'USER': os.environ.get(USER, testUserDefault),
'PASSWORD': os.environ.get(PASSWORD, testPasswdDefault),
'HOST': os.environ.get(HOST, localhost),
'PORT': os.environ.get(PORT, 5432),
},
попробуйте это, дополнительный код не требуется.