【问题标题】:Running ./manage.py migrate during Heroku deployment在 Heroku 部署期间运行 ./manage.py migrate
【发布时间】:2016-07-24 10:25:54
【问题描述】:

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

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

python manage.py migrate

在部署迁移时确实会运行,但它们似乎为每个测功机运行一次(我们使用多个测功机)。因此,数据迁移(与纯模式迁移相反)会运行多次,并且数据会重复。

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

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

谢谢。

【问题讨论】:

    标签: django heroku


    【解决方案1】:

    像在文档中一样设置您的 Procfile

    release: python manage.py migrate
    web: gunicorn myproject.wsgi --log-file -
    

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

    【讨论】:

      【解决方案2】:

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

      如果是生产,您可以使用 heroku maintenance:on --app=<app name here> 将您的应用程序首先进行维护

      【讨论】:

      • 完整的命令是heroku maintenance:on --app=<app name here>
      【解决方案3】:

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

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

      • 应用构建
      • 管道促销
      • 配置变量更改
      • 回滚
      • 通过平台 API 发布

      在发布命令成功完成之前,应用程序 dynos 不会在新版本上启动。

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

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

      更新:

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

      以下内容类型已过时,需要删除:

      ...

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

      Procfile 中的 migrate 命令没有响应,并且 release 命令失败。在这种情况下,删除 migrate 行,实时推送,手动运行 migrate 命令,然后将其添加回来以供将来部署。

      【讨论】:

      • 从 Django 1.9 开始你可以使用 manage.py migrate --noinput docs.djangoproject.com/en/1.10/ref/django-admin/…
      • manage.py migrate --noinput 适用于 Django 1.7+。在 1.9 中,他们添加了 --no-input 别名。
      • 对我来说这不起作用..手动运行脚本时,它会打印出表不存在。我仍然需要手动执行此操作
      【解决方案4】:

      您可以创建一个文件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,旨在简化和解决这个过程。 (目前处于测试阶段)。

      祝你好运!

      【讨论】:

        猜你喜欢
        • 2017-12-15
        • 2021-02-16
        • 2017-08-22
        • 2013-03-29
        • 2013-11-30
        • 1970-01-01
        • 1970-01-01
        • 2020-10-02
        • 1970-01-01
        相关资源
        最近更新 更多