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

Ann*_*nna 2 python git sqlalchemy alembic flask-migrate

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

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

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

dav*_*ism 6

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. 切换到“特征2”和合并“开发”: 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来帮助解决此问题,但这还不存在。