@ilya_chch

Как настроить 2 БД в Django?

в проекте используется 3 базы данных и роутер баз данных:
DATABASES = {
    'default': {
        (postgres, читать, писать)...
    },
    'admission_db': {
        (postgres, читать, писать)...
    },
    'journals_db': {
        (mysql, только читать)...
    }
}
DATABASE_ROUTERS = [
    'main.lib.DbRouter.DbRouter',
]


сам роутер:
class DbRouter:
...

    def allow_migrate(self, db, app_label, model=None, **hints):
        if db == 'admission_db':
            if model and model._meta.app_label == 'admission':
                return True
            return app_label == 'admission'
        elif db == 'journals_db':
            return False
        return None


при миграции с указанием приложения и базы данных
$ python manage.py migrate admission --database admission_db

мигрирует нормально, но если мигрировать через
$ python manage.py migrate
возникает ошибка
django.db.utils.OperationalError: no such table: admission_educationform

как победить проблему?
(django 1.10.5, python 3.5.2)

UPD:
изменив allow_migrate():
def allow_migrate(self, db, app_label, model=None, **hints):
        if db == 'default':
            if app_label == 'admission':
                return False
            elif model and model._meta.app_label == 'admission':
                return False
        if db == 'admission_db':
            if model and model._meta.app_label == 'admission':
                return True
            return app_label == 'admission'
        elif db == 'journals_db':
            return False
        return None

заработало. приходится запускать 2 миграции:
$ python manage.py migrate admission
$ python manage.py migrate

Но уже не появляется ошибка.
  • Вопрос задан
  • 883 просмотра
Решения вопроса 1
sim3x
@sim3x
The migrate management command operates on one database at a time. By default, it operates on the default

If, as in the second example above, you’ve left the default database empty, you must provide a database name each time you run migrate

можно написать алиас для всех бд или написать свой коммандс-обертку
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@ilya_chch Автор вопроса
получилось обойти ошибку с помощью
$ python manage.py migrate --fake
теперь Django думает, что миграции сделаны и ошибки нет, однако хотелось бы попробовать найти решение, чтобы можно было просто запускать migrate и не париться
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы