在Heroku部署期间运行./manage.py迁移

Vin*_*rez 45 django heroku

我正在开发一个Django应用程序,我希望在Heroku上部署时运行我的数据库迁移.

到目前为止,我们只是将以下命令放在Procfile中:

python manage.py migrate
Run Code Online (Sandbox Code Playgroud)

当部署迁移确实运行时,但它们似乎每个dyno运行一次(我们使用几个dynos).因此,数据迁移(与纯模式迁移相反)会多次运行,并且数据会重复.

heroku run python manage.py migrate部署后运行并不令人满意,因为我们希望数据库始终与代码同步.

在Heroku中执行此操作的正确方法是什么?

谢谢.

tom*_*ell 67

这是我的Procfile,它完全按照你的描述工作:

release: python manage.py migrate
web: run-program waitress-serve --port=$PORT settings.wsgi:application
Run Code Online (Sandbox Code Playgroud)

有关定义发布过程的信息,请参阅Heroku文档:https: //devcenter.heroku.com/articles/release-phase#defining-a-release-command

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

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

在发布命令成功完成之前,应用程序dynos将无法在新版本上启动.

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

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

更新:

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

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

...

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

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

  • 从Django 1.9开始,您可以使用`manage.py migrate --noinput`https://docs.djangoproject.com/en/1.10/ref/django-admin/#cmdoption-migrate-noinput (16认同)
  • `manage.py migrate --noinput`适用于Django 1.7+.在1.9中,他们添加了`--no-input`别名. (4认同)

cvn*_*vng 23

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

如果是生产,您可以先将您的应用程序置于维护状态 heroku maintenance:on


Har*_*eno 5

像文档中一样设置您的 Procfile

release: python manage.py migrate
web: gunicorn myproject.wsgi --log-file -
Run Code Online (Sandbox Code Playgroud)

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