Running ./manage.py migrate during Heroku deployment

时间:2016-04-04 18:26:20

标签: django heroku

I am working on a Django app, and I would like my Database migrations to be run when deploying on Heroku.

So far we have simply put the following command in the Procfile:

python manage.py migrate

When deploying the migrations are indeed run, but they seem to be run once for each dyno (and we use several dynos). As a consequence, data migrations (as opposed to pure schema migrations) are run several times, and data is duplicated.

Running heroku run python manage.py migrate after the deployment is not satisfactory since we want the database to be in sync with the code at all times.

What is the correct way to do this in Heroku?

Thanks.

4 个答案:

答案 0 :(得分:53)

这是我的 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

  

发布命令在创建发布后立即运行,但在将发布部署到应用程序的dyno组合之前。这意味着它将在创建新版本的事件之后运行:

     
      
  • 应用构建
  •   
  • 管道推广
  •   
  • 配置变更
  •   
  • 回滚
  •   
  • 通过平台API发布
  •   
     

在发布命令成功完成之前,app dynos将无法在新版本上启动。

     

如果release命令以非零退出状态退出,或者由dyno管理器关闭,则释放将被丢弃,并且不会部署到应用程序的构造中。

但请注意,此功能仍处于测试阶段。

更新

如果您有移除模型和内容类型的迁移,Django需要在控制台中进行确认

  

以下内容类型陈旧且需要删除:

     

...

     

外键与这些内容类型相关的任何对象也将被删除。您确定要删除这些内容类型吗?如果您不确定,请回答“否”。输入“是”'继续,或者不#39;取消:

Procfile中的migrate命令没有响应,release命令失败。在此方案中,删除迁移行,实时推送,手动运行migrate命令,然后将其重新添加以备将来部署。

答案 1 :(得分:16)

迁移会自动在Heroku上运行,但是现在您可以在使用heroku run python manage.py migrate部署dyno后安全地执行此操作。

如果是制作,您可以先使用heroku maintenance:on

将您的应用置于维护状态

答案 2 :(得分:2)

您可以创建一个文件bin/post_compile,它将在构建后运行bash命令 Note that it is still considered experimental.
Read here for more buildpack info.
See here for an example

或者,Heroku是working on a new Releases feature,旨在简化和解决此过程。 (目前处于测试阶段)。

祝你好运!

答案 3 :(得分:1)

Procfile

release: python manage.py migrate --noinput
web: gunicorn mysite.wsgi

记录在https://devcenter.heroku.com/articles/release-phase#specifying-release-phase-tasks