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

到目前为止,我们只在Procfile中添加了以下命令:

python manage.py migrate

在部署时,迁移确实在运行,但它们似乎 for each dyno运行一次(我们使用多个dyno).因此,数据迁移(相对于纯模式迁移)会运行多次,并且会复制数据.

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

在Heroku做这件事的正确方式是什么?

谢谢你.

推荐答案

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

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

  • 应用程序构建
  • 管道促销活动
  • 配置变量更改
  • 回退
  • 通过平台API发布

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

如果Release命令以非零退出状态退出,或者如果它被dyno管理器关闭,那么Release将被丢弃,并且不会被部署到应用程序的 struct 中.

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

Update:

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

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

...

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

配置文件中的Migrate命令不响应,Release命令失败.在此方案中,删除迁移行,实时推送,手动运行迁移命令,然后将其重新添加以供将来部署.

Django相关问答推荐

RDBMS多对多关系Django

Django ORM ForeignKey查询使用注释设置输出

Django:作为模型中的列表元素的字段

Django Form标签和action属性

如果字段为空,则 Unique_together 不起作用.怎么约束呢?

Django如何在没有ctrl点击的情况下允许多选

如何在两个字段上查找 django 模型的副本?

从一个组中获取所有用户 - Django

Django:使用相同的外键在不同的应用程序中 Select 多个列

关于Django中批量保存对象的问题

Django中基于令牌的身份验证

如何在 django tests.py 中创建管理员用户

Django Facebook Connect 应用推荐

Django 1.9:字段与父模型中不存在的字段的字段冲突

Django中的单表继承

如何在 Django 中返回静态 HTML 文件作为响应?

获取 Django 表单中的错误列表

ModelForm 上的 Django 和字段集

Django 模型方法 - create_or_update

Django将整数模型字段的范围设置为约束