如果您没有开始使用alembic / flask-migrate,如何添加迁移现有数据库?

时间:2017-03-24 05:46:41

标签: alembic flask-migrate

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

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

目前我在第3天

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

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

我意识到我的迁移都没有用于创建数据库的实际模式,这应该是您在第1天开始进行flask-migrate时看到的第一次迁移。

如果我要从头开始克隆我的回购邮件:

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

我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:15)

您有两种选择。

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以将新迁移应用于您的数据库。

希望这有帮助!

答案 1 :(得分:0)

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

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

现在很高兴使用此迁移到将来使用。