使用Flask-Migrate在多个分支上工作

时间:2019-04-16 19:11:55

标签: python git sqlalchemy alembic flask-migrate

我正在使用Flask-Migrate(Alembic)管理SQLAlchemy数据库迁移。我正在两个具有不同迁移的不同分支。

  1. 如果我切换分支,则会收到一个错误消息,即找不到迁移。
  2. 如果我将此分支合并到父分支,则需要在两个分支上降级迁移并创建新分支。如果不这样做,我会得到迁移的冲突错误。

我怎样才能更轻松?也许其他工具更像Django的迁移工具,但适用于Flask吗?

1 个答案:

答案 0 :(得分:4)

Alembic要求迁移链与当前迁移的数据库标记匹配。如果您在分支上创建并运行某些迁移,然后切换到另一个分支,则该数据库将被标记为已不存在的迁移。

要在使用迁移时在多个分支上工作,您需要弄清楚要切换到的分支上最新的常见迁移是什么,然后首先降级到该版本。然后检出该分支,并运行对该分支唯一的迁移。

例如,假设您从“ dev”分支创建了两个分支,分别称为“ feature1”和“ feature2”,并且自“ dev”以来每个都有一个新的迁移。要从“功能1”切换到“功能2”:

  1. 降级添加到分支的迁移,在这种情况下为1:flask db downgrade -1
  2. 检出分支:git checkout feature2
  3. 为新分支机构应用所有升级:flask db upgrade

如果您不想由于降级而删除列或表而丢失数据,则需要转储并还原每个分支的数据库。


如果您正在使用“ feature1”并将其合并到“ dev”中,则需要更新“ feature2”,以便它知道已合并的新迁移。Alembic将支持拥有多个分支,只要所有存在迁移。合并“ feature2”后,您可以生成合并迁移,以将两个迁移分支合并回一个分支。

  1. 将“功能1”合并到“开发”中:git checkout devgit merge feature1
  2. 切换到“ feature2”并合并“ dev”:git checkout feature2git merge dev
  3. 从“ dev”和“ feature2”运行迁移:flask db upgrade
  4. 继续研究“ feature2”。
  5. 将“功能2”合并到“开发”中:git checkout devgit merge feature2
  6. 找到需要合并的迁移ID:flask db heads
  7. flask db merge id1 id2,替换上一步中的ID。
  8. 更新到合并,请注意只有一个头:flask db upgradeflask db heads

不幸的是,这是一个手动过程。 Alembic需要迁移链来匹配数据库标记,而目前尚无解决方法。您也许可以编写一个git hook来帮助解决此问题,但这还不存在。