13

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

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

目前我在第 3 天

如果您从第 0 天开始,有很多关于如何让 Flask-migrate 运行的文档。您只需调用flask db init,flask 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.

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

4

2 回答 2

35

你有两个选择。

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

希望这可以帮助!

于 2017-03-24T15:00:28.080 回答
0

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

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

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

于 2021-06-14T20:33:09.007 回答