qmax
@qmax
программер

Как заставить работать миграции с admin/auth/contenttypes на нескольких db?

Имеется:
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'foo',
    'bar'
}


Приложения 'foo' и 'bar' живут в разных отдельных базах. Вся contrib-щина должна жить в локальной sqlite, она нужна исключительно из-за админки, причом permissions пофигу.

Очевиный расклад:
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR + '/var/db.sqlite'
    },
    'foo': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'HOST': 'foohost',
        'NAME': 'foo'
    },
    'bar': {
        'ENGINE': 'django.db.backends.postgresql',
        'HOST': '',
        'NAME': 'bar'
    }
}

DATABASE_ROUTERS = ['regions.dbrouter.DbRouter']   # возвращает тупо model._meta.app_label


Известная проблема: migrate не умеет в dbrouter и суёт всё либо в default, либо в базу указанную --database. А вот известного решения проблемы я что-то не нагуглил.

Если мигрировать приложения по отдельности с указанием базы:
./manage.py migrate auth
./manage.py migrate admin
./manage.py migrate sessions
# к этому моменту всяческие contenttype и permissions для всех обнаруженных приложений уже созданы
./manage.py migrate foo --database=foo
# тут срабатывает post_migrate_signal и auth/contenttypes лезет в базу foo за своими таблицами...

И всё сваливается с "Error creating new content types. Please make sure contenttypes "
А при запуске runserver ругается, что You have unapplied migrations. Хотя вроде всё работает.

Такие дела.
  • Вопрос задан
  • 104 просмотра
Пригласить эксперта
Ответы на вопрос 1
qmax
@qmax Автор вопроса
программер
Workaround: отключать нафиг contrib (включая admin urls), делать миграции, а потом включать contrib обратно.
Чем грозит - непонятно.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы