我正在使用 Flask-Migrate (Alembic) 来管理 SQLAlchemy 数据库迁移。我正在处理具有不同迁移的两个不同分支。
- 如果我切换分支,我会收到一个错误,指出找不到迁移。
- 如果我将这个分支 merge 到父分支中,我需要在两个分支上降级迁移并创建一个新分支。如果我不这样做,我会收到迁移的冲突错误。
我怎样才能更轻松地做到这一点?也许另一个工具更像 Django 的迁移,但用于 Flask?
最佳答案
Alembic 需要迁移链来匹配当前迁移的数据库标记。如果您在一个分支上创建并运行一些迁移,然后切换到另一个分支,数据库将被标记为正在进行不再存在的迁移。
要在使用迁移的同时在多个分支上工作,您需要弄清楚要切换到的分支上最新的常见迁移是什么,然后先降级到该版本。然后检查该分支,并运行它独有的任何迁移。
例如,假设您从“dev”分支创建了两个分支,分别称为“feature1”和“feature2”,并且每个分支都有一个自“dev”以来的新迁移。从“feature1”切换到“feature2”:
- 降级添加到分支的迁移,在本例中为 1:
flask db downgrade -1
。 - check out 分支:
git checkout feature2
- 为新分支应用任何升级:
flask db upgrade
如果您不想因为删除列或表的降级而丢失数据,则需要为每个分支转储和恢复数据库。
如果您正在处理“feature1”并将其 merge 到“dev”,则需要更新“feature2”以便它知道 merge 的新迁移。Alembic 将支持拥有多个分支,只要所有存在迁移。 merge “feature2”后,您可以生成 merge 迁移以将两个迁移分支 merge 回一个。
- 将“feature1” merge 到“dev”:
git checkout dev
,git merge feature1
- 切换到“feature2”并 merge “dev”:
git checkout feature2
,git merge dev
- 从“dev”和“feature2”运行迁移:
flask db upgrade
- 继续处理“feature2”。
- 将“feature2” merge 到“dev”:
git checkout dev
,git merge feature2
- 找到需要 merge 的migration ids:
flask db heads
flask db merge id1 id2
,替换上一步中的 id。- 更新到merge,注意只有一个head:
flask db upgrade
,flask db heads
不幸的是,这是一个手动过程。 Alembic 需要迁移链来匹配数据库标记,目前没有办法解决这个问题。您也许可以编写一个 git 钩子(Hook)来帮助解决这个问题,但这并不是已经存在的东西。
关于python - 使用 Flask-Migrate 在多个分支上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55715129/