【问题标题】:How do you add migrate an existing database with alembic/flask-migrate if you did not start off with it?如果您没有开始使用 alembic/flask-migrate 迁移现有数据库,如何添加它?
【发布时间】:2017-03-24 05:46:41
【问题描述】:

这是已经发生和正在发生的事件链

  • 第 0 天:我开发并部署了我的应用程序
  • 第 1 天:我创建了新数据库
  • 第 3 天:我意识到我想在现有表中添加一个新行。我找到了 flask-migrate,我想用它来迁移我的数据库。

目前我在第 3 天

如果您从第 0 天开始,有很多关于如何让 Flask-migrate 运行的文档。您只需致电 flask db initflask db migrateflask db upgrade

但是,就我而言,它有点不同。我运行了命令,我的第一个迁移版本是 empty。然后我修改了我的数据库模式并生成了一个新的迁移。现在我最新的迁移只有 1 行迁移,它将新行添加到表中。

我意识到我的所有迁移都没有创建数据库的实际架构,如果您在第 1 天开始烧瓶迁移,这应该是您看到的第一个迁移。

如果我要从头开始克隆我的仓库:

flask db migrate 将产生alembic.util.exc.CommandError: Target database is not up to date.

flask db upgrade 将产生sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) relation "offer" does not exist

我能做些什么来解决这个问题?

【问题讨论】:

    标签: alembic flask-migrate


    【解决方案1】:

    你有两个选择。

    1) 如果您只想跟踪未来的数据库迁移

    • 运行flask db init,创建迁移存储库。
    • 将新列添加到您的数据库模型中。
    • 运行flask db migrate,生成迁移。迁移脚本中只会包含新列。
    • 运行 flask db upgrade 将新迁移应用到您的数据库。

    此时您的数据库应该有新列,您可以继续工作。每当您需要进行其他更改时,请重复上述步骤。

    请注意,使用这种方法,您无法从头开始重新创建整个数据库。您必须有一种方法将数据库初始化为您在第 1 天拥有的架构,然后您可以应用迁移历史来将其升级到您当前的架构。

    2) 如果您想跟踪整个迁移历史记录,包括将 Flask-Migrate 添加到应用程序当天的架构。

    这有点棘手,但可以做到。

    • flask db init 开始,创建迁移存储库。
    • 接下来,您需要让 Flask-Migrate 认为您的数据库是空的。您可以通过重命名您的实际数据库并创建一个具有相同名称但其中没有表的新数据库来做到这一点。在该状态下,运行flask db migrate。这将生成一个包含整个数据库架构的迁移。
    • 完成初始迁移后,将数据库恢复到正确状态。
    • 运行flask db stamp head 将数据库标记为已更新。
    • 将新列添加到您的数据库模型中。
    • 再次运行flask db migrate,生成第二次迁移。迁移脚本中只会包含新列。
    • 运行 flask db upgrade 以将新迁移应用到您的数据库。

    希望这会有所帮助!

    【讨论】:

    • 当我运行第二个flask db migrate 时,我得到alembic.util.exc.CommandError: Target database is not up to date.。我需要做些什么(比如 Django 的虚假迁移)才能首先使数据库保持最新状态吗?
    • 你是对的,我错过了这些说明中的一步。我现在通过添加db stamp head 命令更正了帖子。
    • 请注意,这适用于 flask-migrate,因为会有一个现有的 declarative_base()。
    • 这对通过 dev -> test -> prod 促进数据库更改非常有效 (flask db stamp head)。
    【解决方案2】:

    我使用简单的步骤来跟踪整个迁移历史:

    1. 创建一个新数据库以供临时使用并使用此数据库端点。
    2. 移除迁移文件夹(如果存在)。
    3. 运行 flask db init 以创建新的迁移。
    4. 运行 flask db migrate 以从头开始初始化您现有的模块迁移。
    5. 现在使用原始数据库端点。
    6. 运行 flask db stamp head 这将使用正确的迁移版本在数据库中创建 alembic_version 表。

    现在可以使用此迁移到将来使用。

    【讨论】:

      猜你喜欢
      • 2019-06-12
      • 2015-12-24
      • 2021-11-08
      • 1970-01-01
      • 2016-05-21
      • 2013-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多