【问题标题】:Work on multiple branches with Flask-Migrate使用 Flask-Migrate 在多个分支上工作
【发布时间】:2019-09-06 23:12:46
【问题描述】:
我正在使用 Flask-Migrate (Alembic) 来管理 SQLAlchemy 数据库迁移。我正在两个具有不同迁移的不同分支上工作。
- 如果我切换分支,我会收到找不到迁移的错误。
- 如果我将此分支合并到父分支中,我需要在两个分支上降级迁移并创建一个新分支。如果我不这样做,我会得到迁移的冲突错误。
我怎样才能更轻松?也许另一个工具更像 Django 的迁移,但用于 Flask?
【问题讨论】:
标签:
python
git
sqlalchemy
alembic
flask-migrate
【解决方案1】:
Alembic 要求迁移链与当前迁移的数据库标记相匹配。如果您在一个分支上创建并运行一些迁移,然后切换到另一个分支,则该数据库被标记为正在进行一个不再存在的迁移。
要在使用迁移时在多个分支上工作,您需要弄清楚要切换到的分支上最新的常见迁移是什么,然后首先降级到该版本。然后签出分支,并运行它独有的任何迁移。
例如,假设您在“dev”分支上创建了两个名为“feature1”和“feature2”的分支,并且每个分支自“dev”以来都有一个新的迁移。从“feature1”切换到“feature2”:
- 降级添加到分支的迁移,在本例中为 1:
flask db downgrade -1。
- 结账分店:
git checkout feature2
- 为新分支应用任何升级:
flask db upgrade
如果您不希望由于删除列或表的降级而丢失数据,则需要转储并恢复每个分支的数据库。
如果您正在处理“feature1”并将其合并到“dev”中,则需要更新“feature2”以便它知道合并的新迁移。只要所有的,Alembic 将支持拥有多个分支存在迁移。合并“feature2”后,您可以生成合并迁移以将两个迁移分支合并回一个。
- 将“feature1”合并到“dev”中:
git checkout dev, git merge feature1
- 切换到“feature2”并合并“dev”:
git checkout feature2,git merge dev
- 从“dev”和“feature2”运行迁移:
flask db upgrade
- 继续处理“feature2”。
- 将“feature2”合并到“dev”中:
git checkout dev, git merge feature2
- 找到需要合并的迁移id:
flask db heads
-
flask db merge id1 id2,替换上一步中的 id。
- 更新合并,注意只有一个头:
flask db upgrade,flask db heads
很遗憾,这是一个手动过程。 Alembic 要求迁移链与数据库标记匹配,目前没有办法解决。您也许可以编写一个 git 钩子来帮助解决这个问题,但它不是已经存在的东西。