在部署前安全运行迁移
项目描述
django-safemigrate为Django添加了一个safemigrate命令,允许在部署时安全运行迁移命令。
用法
安装django-safemigrate,然后在设置文件中的INSTALLED_APPS中添加此命令
INSTALLED_APPS = [
# ...
"django_safemigrate.apps.SafeMigrateConfig",
]
然后标记任何可能在预部署阶段运行的迁移,例如添加列的迁移。
from django_safemigrate import Safe
class Migration(migrations.Migration):
safe = Safe.before_deploy
此时,您可以运行safemigrate Django命令来运行迁移,并且只有这些迁移会运行。然而,如果这些迁移的依赖项在部署代码之前不安全运行,则这些迁移将被阻止,safemigrate命令将因错误而失败。
当代码完全部署后,只需运行正常的 migrate Django 命令,它仍然可以正常工作。例如,您可以将其添加到 Heroku 应用的发布阶段,并在新版本推广时自动运行安全迁移。
安全选项
迁移的 safe 属性有三个选项值。
Safe.before_deploy
此迁移仅在代码更改部署之前安全运行。例如,为模型添加新字段的迁移。
Safe.after_deploy
此迁移仅在代码更改部署之后安全运行。这是在没有提供 safe 属性时的默认设置。例如,从模型中删除字段的迁移。
Safe.always
此迁移在代码更改部署前后都可以安全运行。例如,更改字段 help_text 的迁移。
Pre-commit Hook
要充分利用 django-safemigrate,确保所有迁移都带有适当的 safe 值是非常重要的。为此,我们提供了一个与 pre-commit 一起使用的钩子。安装和配置 pre-commit,然后将以下内容添加到 .pre-commit-config.yaml 的 repos 键中。
repos:
- repo: https://github.com/aspiredu/django-safemigrate
rev: "4.3"
hooks:
- id: check
非严格模式
在正常操作中,如果存在必须先于部署运行的迁移,而这些迁移依赖于任何标记为部署后运行的迁移(或未标记),则命令将引发错误以指示存在应已运行但尚未运行并阻止预期运行的受保护迁移。
然而,在开发中,这些通常会在开发者之间积累,并且由于开发过程中的过渡期间可以接受停机时间,因此最好允许命令继续执行而不引发错误。
要启用非严格模式,添加 SAFEMIGRATE 设置
SAFEMIGRATE = "nonstrict"
在此模式下,safemigrate 将运行所有不受任何不安全迁移阻止的迁移。任何剩余的迁移都可以使用正常的 migrate Django 命令事后运行。
禁用模式
要完全禁用 safemigrate 的保护功能,添加 SAFEMIGRATE 设置
SAFEMIGRATE = "disabled"
在此模式下,safemigrate 将像使用正常的 migrate Django 命令一样运行迁移。
贡献
要开始贡献,您需要克隆存储库,使用 poetry 安装依赖项,并设置 pre-commit。
git clone git@github.com:aspiredu/django-safemigrate.git
cd django-safemigrate
poetry install
pre-commit install
要运行测试,请使用
poetry run tox
要发布新版本
将上一个版本的所有实例替换为新版本。
提交并将该提交推送到 origin。
使用 git tag 1.0 标记提交并推送到 origin。
在 GitHub 上创建 新版本。
使用 poetry publish 将新版本发布到 PyPI。
有关如何配置本地环境以发布到 PyPI 的信息,请参阅 Poetry 的文档。将您的 PyPI token 设置为仅对 django-safemigrate 有效。
poetry config pypi-token.pypi <my-token>