Heroku:Django Migration 版本未在部署中运行

Posted

技术标签:

【中文标题】Heroku:Django Migration 版本未在部署中运行【英文标题】:Heroku: Django Migration release not running in deployment 【发布时间】:2020-11-19 17:35:31 【问题描述】:

我有一个在 Heroku 中运行的 Django 应用程序。在初始部署时,我使用 heroku run 手动迁移了数据库架构。

下次我需要将迁移推送到应用程序时,发布没有任何抱怨。 然而,当我去现场查看它时,我收到了一个编程错误:新列不存在。从未运行过迁移。

这是我的 Procfile:

web: gunicorn APP_NAME.wsgi --log-file -
release: python manage.py migrate
release: python manage.py collectstatic --noinput
worker: celery worker -A APP_NAME -B -E -l info

collectstatic 版本运行成功,但 migrate 版本似乎被忽略或忽略了。当我手动迁移时,它们迁移没有错误。在迁移文件夹中有一个空的__init__.py 文件。

如果有人知道什么可能会阻碍迁移版本的运行,那就太棒了。

【问题讨论】:

【参考方案1】:

好的,我想通了。尽管 Heroku 在其文档中似乎暗示 Procfile 中可以有多个发布标签,但这是不正确的。

Procfile 中的最后一个 release 标记优先。 这意味着为了在发布阶段运行多个命令,您必须使用 shell 脚本。

现在,我的 Procfile 看起来像这样:

web: gunicorn APP_NAME.wsgi --log-file -
release: ./release.sh
worker: celery worker -A APP_NAME -B -E -l info

我有一个 release.sh 脚本,看起来像这样:

python manage.py migrate
python manage.py collectstatic --no-input

确保您的 RELEASE.SH 脚本可执行:

在提交之前在终端中运行chmod u+x release.sh 应该可以解决问题。

【讨论】:

【参考方案2】:

由于我无法评论 @rchurch4 的答案,所以这里是:如果您在发布时只有几个命令要运行,您可以在 Procfile 中使用以下内容:

release:  command1 && command2 && command3 [etc.]

例如

release:  python manage.py migrate && python manage.py loaddata foo && python manage.py your_custom_management_command

【讨论】:

以上是关于Heroku:Django Migration 版本未在部署中运行的主要内容,如果未能解决你的问题,请参考以下文章

不使用 Django 的 Python 数据库(用于 Heroku)

[Django][Python]Django重置Migration

[Django][Python]Django重置Migration

Django笔记三十七之多数据库操作(补充版)

PyTest-Django 在缺少 django_migration 表时失败

Django Migration RunSQL 以数据库类型为条件