使用 Flask-Migrate 在多个分支上工作
Work on multiple branches with Flask-Migrate
我正在使用 Flask-Migrate (Alembic) 来管理 SQLAlchemy 数据库迁移。我正在处理具有不同迁移的两个不同分支。
- 如果我切换分支,我会收到找不到迁移的错误。
- 如果我将这个分支合并到父分支中,我需要在两个分支上降级迁移并创建一个新分支。如果我不这样做,我会收到迁移的冲突错误。
我怎样才能更轻松地做到这一点?也许另一个工具更像 Django 的迁移,但对于 Flask?
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 挂钩来帮助解决这个问题,但这并不是已经存在的东西。
我正在使用 Flask-Migrate (Alembic) 来管理 SQLAlchemy 数据库迁移。我正在处理具有不同迁移的两个不同分支。
- 如果我切换分支,我会收到找不到迁移的错误。
- 如果我将这个分支合并到父分支中,我需要在两个分支上降级迁移并创建一个新分支。如果我不这样做,我会收到迁移的冲突错误。
我怎样才能更轻松地做到这一点?也许另一个工具更像 Django 的迁移,但对于 Flask?
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 挂钩来帮助解决这个问题,但这并不是已经存在的东西。