将数据库迁移从sqlalchemy-migrate更改为Flask-Migrate

时间:2015-01-25 11:39:13

标签: python flask-sqlalchemy data-migration alembic flask-migrate

我在miguel flask tutorial

上有一个网络应用程序

所以我将sqlalchemy-migrate用于数据库,现在我应该在迁移中使用 Alembic 如何进行配置?有什么方法可以从sqlalchemy-migrate更改为Flask-Migrate吗?(因为我的应用程序已经完成并且再次执行它是如此多的工作)Thanx

  

db_migrate.py:

#!flask/bin/python
import imp
from migrate.versioning import api
from app import db
from config import SQLALCHEMY_DATABASE_URI
from config import SQLALCHEMY_MIGRATE_REPO
migration = SQLALCHEMY_MIGRATE_REPO + '/versions/%03d_migration.py' % (api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) + 1)
tmp_module = imp.new_module('old_model')
old_model = api.create_model(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
exec old_model in tmp_module.__dict__
script = api.make_update_script_for_model(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, tmp_module.meta, db.metadata)
open(migration, "wt").write(script)
api.upgrade(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
print 'New migration saved as ' + migration
print 'Current database version: ' + str(api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO))

1 个答案:

答案 0 :(得分:7)

有三种可能的方法可以解决这个问题,其中两种相对容易,但最后一种方法非常费力:

1。仅使用Flask-Migrate跟踪未来的迁移

这是最简单的,但不那么有趣。只需像安装新项目一样安装和设置Flask-Migrate,下次需要迁移时,请使用它而不是sqlalchemy-migrate。

缺点是Alembic不记录当前的迁移状态,只有您将来应用的迁移是。

2。跟踪数据库的当前状态作为单个初始迁移

这改进了以前的方法并使Flask-Migrate的存储库完整,但是sqlalchemy-migrate中的所有迁移都折叠为Alembic的单个迁移。

流程如下:

  • 创建Flask-Migrate存储库
  • 如果您愿意,请备份数据库中的数据(下一步将丢失它!)
  • 使用教程中的db_downgrade.py脚本,将数据库设置为版本0(空数据库)。
  • 使用Flask-Migrate生成迁移。此迁移将包括所有数据库更改,直到当前版本。
  • 将数据还原到数据库。
  • 通常使用Flask-Migrate应用未来的迁移。您可以删除sqlalchemy-migrate存储库,因为所有数据库更改现在都在Alembic中。

3。将整个迁移历史记录传输到Flask-Migrate

这是最复杂的解决方案,因为它要求将sqlalchemy-migrate中的每次迁移单独转移到Alembic。

流程如下:

  • 创建Flask-Migrate存储库
  • 如果您愿意,请备份数据库中的数据(下一步将丢失它!)
  • 使用教程中的db_downgrade.py脚本,将数据库设置为版本0(空数据库)。或者如果更容易,只需手动删除数据库中的所有表。
  • 假设您的源代码控制上有应用程序,请检查与您的第一次数据库迁移相匹配的代码版本。
  • 使用Flask-Migrate生成迁移。此迁移将与您的第一次sqlalchemy-migrate迁移相同。
  • 签出与第二个sqlalchemy-migrate迁移相匹配的代码版本。
  • 使用Flask-Migrate生成第二次迁移。此迁移将与您的第二次sqlalchemy-migrate迁移相同。
  • 继续这样,直到您到达当前版本的代码和最后一次数据库迁移。
  • 将数据还原到数据库。
  • 通常使用Flask-Migrate应用未来的迁移。您可以删除sqlalchemy-migrate存储库,因为所有数据库更改现在都在Alembic中。

如果您需要推荐,我认为在大多数情况下,#2是最佳选择。如果我预计我需要将我的数据库降级到历史上的特定迁移,我只会经历#3的痛苦。