【问题标题】:change database migrations from sqlalchemy-migrate to Flask-Migrate将数据库迁移从 sqlalchemy-migrate 更改为 Flask-Migrate
【发布时间】:2015-01-25 11:39:13
【问题描述】:

我有一个基于 miguel flask tutorial 的网络应用程序

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

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))

【问题讨论】:

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


    【解决方案1】:

    有三种可能的方法来处理这个问题,其中两种相对容易,但最后一种相当费力:

    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 的痛苦。

    【讨论】:

    • 谢谢你的回复,但不幸的是我有点新,不知道如何备份数据或恢复它们是否有一个特殊的命令行或教程,或者你能更详细地解释它@Miguel
    • 这取决于数据库。你有什么样的数据库?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 2011-12-01
    • 2015-12-24
    • 2019-01-17
    • 1970-01-01
    • 2014-12-08
    相关资源
    最近更新 更多