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

How do you add migrate an existing database with alembic/flask-migrate if you did not start off with it?

这是已经发生和正在发生的一连串事件

目前我在第 3 天

如果您从第 0 天开始,有很多关于如何进行 Flask 迁移的文档 运行。您只需调用 flask db initflask db migrateflask db upgrade

但是,对于我来说,情况有点不同。我 运行 命令,我的第一个迁移版本是 empty。然后我修改了我的数据库模式并生成了一个新的迁移。现在我的最新迁移只有 1 行迁移,将新行添加到 table。

我意识到 none 我的迁移具有创建数据库的实际模式,如果您在第 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

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

你有两个选择。

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

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