Подтвердить что ты не робот

Выполнение миграции. /manage.py во время развертывания Heroku

Я работаю над приложением Django, и я бы хотел, чтобы мои миграции базы данных выполнялись при развертывании на Heroku.

До сих пор мы просто ввели в Procfile следующую команду:

python manage.py migrate

Когда развертывание миграции действительно выполняется, но они кажутся запускаемыми один раз для каждого динамика (и мы используем несколько динамиков). Как следствие, миграция данных (в отличие от миграции чистой схемы) выполняется несколько раз, а данные дублируются.

Запуск heroku run python manage.py migrate после развертывания не является удовлетворительным, так как мы хотим, чтобы база данных постоянно синхронизировалась с кодом.

Каков правильный способ сделать это в Heroku?

Спасибо.

4b9b3361

Ответ 1

Это мой Procfile, и он работает именно так, как вы описываете:

release: python manage.py migrate
web: run-program waitress-serve --port=$PORT settings.wsgi:application

См. документы Heroku по определению процесса выпуска: https://devcenter.heroku.com/articles/release-phase#defining-a-release-command

Команда release запускается сразу после создания релиза, но до того, как релиз будет развернут в процессе создания динамограмм приложений. Это означает, что он будет запущен после события, которое создаст новую версию:

  • Создание приложения
  • Продвижение трубопровода
  • Изменение конфигурации var
  • Откат
  • Выпуск через API платформы

Динамики приложений не будут загружаться в новую версию до тех пор, пока команда release не завершится успешно.

Если команда release завершает работу с ненулевым статусом выхода или если ее выключает динамический менеджер, релиз будет отброшен и не будет развернут для формирования приложений.

Помните, что эта функция все еще находится в бета-версии.

Update:

Когда у вас есть миграции, удаляющие модели и типы контента, Django требует подтверждения в консоли

Следующие типы содержимого устаревают и их необходимо удалить:

...

Любые объекты, связанные с этими типами содержимого внешним ключом, также будут удалены. Вы действительно хотите удалить эти типы контента? Если вы не уверены, ответьте "нет". Введите "да" для продолжения или "нет" для отмены:

Команда migrate в вашем Procfile не отвечает, и команда release завершается с ошибкой. В этом случае удалите строку переноса, нажмите в режиме реального времени, запустите команду миграции вручную, а затем добавьте ее для будущих развертываний.

Ответ 2

Миграция автоматически запускается на Heroku, но теперь вы можете спокойно сделать это, как только ваш dyno будет развернут с помощью heroku run python manage.py migrate.

Если вы работаете с продуктом, вы можете разместить свое приложение в обслуживании сначала с помощью heroku maintenance:on

Ответ 3

Вы можете создать файл bin/post_compile, который будет запускать команды bash после сборки.
Обратите внимание, что он все еще считается экспериментальным.
Читайте здесь для получения дополнительной информации о buildpack.
См. здесь пример

В качестве альтернативы, Heroku работает над новой функцией Release Releases, целью которой является упрощение и решение этого процесса. (В настоящее время в бета-версии).

Удачи!