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

标签 python git sqlalchemy alembic flask-migrate

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

  1. 如果我切换分支,我会收到一个错误,指出找不到迁移。
  2. 如果我将这个分支 merge 到父分支中,我需要在两个分支上降级迁移并创建一个新分支。如果我不这样做,我会收到迁移的冲突错误。

我怎样才能更轻松地做到这一点?也许另一个工具更像 Django 的迁移,但用于 Flask?

最佳答案

Alembic 需要迁移链来匹配当前迁移的数据库标记。如果您在一个分支上创建并运行一些迁移,然后切换到另一个分支,数据库将被标记为正在进行不再存在的迁移。

要在使用迁移的同时在多个分支上工作,您需要弄清楚要切换到的分支上最新的常见迁移是什么,然后先降级到该版本。然后检查该分支,并运行它独有的任何迁移。

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

  1. 降级添加到分支的迁移,在本例中为 1:flask db downgrade -1
  2. check out 分支:git checkout feature2
  3. 为新分支应用任何升级:flask db upgrade

如果您不想因为删除列或表的降级而丢失数据,则需要为每个分支转储和恢复数据库。


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

  1. 将“feature1” merge 到“dev”:git checkout dev, git merge feature1
  2. 切换到“feature2”并 merge “dev”:git checkout feature2, git merge dev
  3. 从“dev”和“feature2”运行迁移:flask db upgrade
  4. 继续处理“feature2”。
  5. 将“feature2” merge 到“dev”:git checkout dev, git merge feature2
  6. 找到需要 merge 的migration ids: flask db heads
  7. flask db merge id1 id2,替换上一步中的 id。
  8. 更新到merge,注意只有一个head:flask db upgrade, flask db heads

不幸的是,这是一个手动过程。 Alembic 需要迁移链来匹配数据库标记,目前没有办法解决这个问题。您也许可以编写一个 git 钩子(Hook)来帮助解决这个问题,但这并不是已经存在的东西。

关于python - 使用 Flask-Migrate 在多个分支上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55715129/

相关文章:

python - 如何捕获使用 pythonw 执行的 Python 脚本的标准输出?

python 请求从谷歌翻译下载不正确的声音文件

python - Pandas 比较相似的 DataFrames 并获得 Min

git - 列出特定文件的完整提交历史

git checkout 需要几个小时

git - 如何自动化git在服务器上自动克隆一个repo?

python - 二进制数据应使用哪种 SQLAlchemy 列类型?

python - 使用 Urllib 使用 Python 3.5 下载 Zip 文件夹

python - SQLAlchemy create_all() 不创建表

python - SQLAlchemy 通过父连接查询子表过滤器