Django: запуск сервера, использующего определенную базу данных из нескольких баз данных

Я пытаюсь создать 2 базы данных в django. Вторая база данных предназначена для тестирования, поэтому эти две базы данных практически имеют одинаковые модели.

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

Шаги, которые я выполнил для настройки баз данных:

  1. Я создал второе приложение под названием 'testing', так что теперь в корневой папке моего проекта есть приложение api (настоящее) и testing (приложение, предназначенное для тестовой базы данных). После этого добавил те же модели из api/models.py в testing/models.py
  2. .
  3. Создал маршрутизатор для первой базы данных и второй базы данных:
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
  1. Отредактировано 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,
    }
}

  1. Ran python manage.py migrate --database=test_db Вот как выглядит тестовая база данных после миграции. Похоже, что некоторые таблицы, которые django обычно создает, отсутствуют
  2. .

Теперь я не уверен, какую команду я должен выполнить, чтобы заставить 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),
},

попробуйте это, дополнительный код не требуется.

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