Heroku部署过程中运行"./manage.py migrate"命令

58

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

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

python manage.py migrate

在部署时,迁移确实会运行,但似乎每个工作进程都会运行一次(我们使用多个工作进程)。因此,数据迁移(与纯模式迁移相对)会运行多次,并且数据会被复制。

在部署后运行heroku run python manage.py migrate并不理想,因为我们希望数据库始终与代码同步。

在Heroku上正确的做法是什么?

谢谢。

4个回答

81

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

直到发布命令成功完成,应用程序dynos才会在新版本上启动。

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

请注意,此功能仍处于测试阶段(beta)。

更新:

当您有移除模型和内容类型(migrations that remove models and content types)的迁移操作时,Django需要在控制台上进行确认。

The following content types are stale and need to be deleted:

...

Any objects related to these content types by a foreign key will also be deleted. Are you sure you want to delete these content types? If you're unsure, answer 'no'. Type 'yes' to continue, or 'no' to cancel:

如果您的Procfile中的迁移命令没有响应并导致发布命令失败。在这种情况下,请移除migrate行,进行推送并手动运行迁移命令,然后为未来的部署重新添加它。


18
自Django 1.9起,您可以使用manage.py migrate --noinput - Joren
6
manage.py migrate --noinput 可以在 Django 1.7 及以上版本中使用。在 1.9 版本中,他们添加了 --no-input 的别名。 - DhhJmm
对我来说这个不起作用...手动运行脚本时会打印出表不存在的信息。我仍然需要手动完成这个任务。 - Matej J

32

在Heroku上,迁移自动运行,但目前您可以安全地在部署Dyno之后执行迁移,使用heroku run python manage.py migrate

如果是生产环境,您可以先使用heroku maintenance:on --app=您的应用名称将您的应用置于维护状态。


1
完整的命令是 heroku maintenance:on --app=<应用程序名称> - O-9

5

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接