Для проекта в Django мне нужно использовать две базы данных: по умолчанию и удаленную . Я создал routers.py
и все работает отлично.
Было требование создать таблицу в удаленной базе данных, и я создал миграцию, запустил ее и таблица django_migrations
была создана. Я хочу иметь только одну таблицу django_migrations
в базе данных по умолчанию.
Соответствующая часть routers.py
здесь:
class MyRouter(object):
# ...
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label == 'my_app':
return db == 'remote'
return None
Я запускаю миграцию так:
python manage.py migrate my_app --database=remote
Теперь, когда я делаю:
python manage.py runserver
Я получаю следующее предупреждение:
У вас есть 1 не примененная миграция. Ваш проект может работать некорректно, пока вы не примените миграции для приложений: my_app.
Запустите «python manage.py migrate», чтобы применить их.
Таблицы для my_app
создаются в remote
базе данных, а django_migrations
внутри remote
базы миграции помечаются как примененные.
РЕДАКТИРОВАТЬ:
Как заставить Django использовать только одну таблицу django_migrations
, но по-прежнему применять миграции в разные базы данных?
Как применить миграции в разных базах данных, чтобы не вызывать предупреждений?
источник
django_migrations
таблицу, необходимо различать строки с миграциями дляdefault
иremote
db. Это довольно глубоко во внутренностях Джанго. Я бы даже рискнул заявить, что это потребует значительного изменения кода миграции.Ответы:
Благодаря комментариям на мой вопрос я провел небольшое исследование и сделал следующие выводы.
Использование нескольких баз данных приводит к созданию таблицы
django_migrations
при использовании миграций. Там нет возможности записывать миграции только в одной таблицеdjango_migrations
, как комментарий от Kamil Niski объясняет. Это понятно после прочтения файлаdjango/db/migrations/recorder.py
.Я проиллюстрирую пример с проектом
foo
и приложениемbar
внутри проекта. Приложениеbar
имеет только одну модельBaz
.Мы создаем проект:
Теперь у нас есть это содержимое в главном каталоге проекта:
У меня есть привычка группировать все приложения в каталоге проекта:
В файле
foo/settings.py
мы настраиваем параметры для использования двух разных баз данных, для целей этого примера мы используемsqlite3
:Теперь мы запускаем миграции:
При этом выполняются все миграции, часть
--database=default
является необязательной, поскольку, если не указано, Django использует базу данных по умолчанию.Django применил все миграции к базе данных по умолчанию:
Теперь мы создаем модель
Baz
:models.py
:зарегистрируйте приложение
bar
вINSTALLED_APPS
(foo/settings.py
) и создайте миграции:Перед запуском миграций мы создаем
routers.py
внутриbar
приложения:и зарегистрируйте его в
foo/settings.py
:Теперь наивным подходом было бы запустить миграцию
bar
вremote
базу данных:Миграции были применены к
remote
базе данных:Когда мы бежим:
будет выдано следующее предупреждение:
Кажется, все работает нормально. Однако это предупреждение не удовлетворяет.
Правильный способ - запустить все миграции для каждой базы данных, как указано в этом ответе .
Это будет выглядеть так:
и после создания миграций для
bar
:Маршрутизатор позаботится о том, чтобы таблица
bar_baz
создавалась только вremote
базе данных, но Django помечает миграции как применяемые в обеих базах данных. Также столы дляauth
,admin
,sessions
и т.д. , будут созданы только вdefault
базе данных, как указано вrouters.py
. Таблицаdjango_migrations
вremote
базе данных также будет содержать записи для этих миграций.Это долгое чтение, но я надеюсь, что оно проливает некоторый свет на эту, по моему мнению, не полностью объясненную проблему в официальной документации .
источник