首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何清理不完整的alembic运行

如何清理不完整的alembic运行
EN

Stack Overflow用户
提问于 2013-07-27 12:27:12
回答 2查看 4.9K关注 0票数 9

我正在尝试使用带有MySQL引擎的alembic来执行在线迁移。我发现,当我的onupgrade()方法中的操作失败时,我的数据库就会陷入不一致的状态,并且我无法使用alembic,除非我手动清除onupgrade()中失败之前发生的任何操作。

示例:

代码语言:javascript
复制
def upgrade():
    op.create_table('sometable',
            Column('id', INTEGER, primary_key=True),
            Column('name', VARCHAR(150), nullable=False, unique=True))
    op.add_column('anothertable' Column('id', INTEGER))
    op.create_table('secondtable')

因此,如果我运行此命令而op.add_column失败,即使我修复了add_column行,现在"sometable“仍然存在,因此第一个操作将总是失败。我无法运行我的降级脚本,因为alembic从未更新过版本,因为它没有完成升级。

我在想,如果有一种方法可以强制运行我的ondowngrade(),那可能会很有用。我不得不忽略错误,因为肯定会有一些错误。比如去掉"secondtable“。不过,我找不到任何方法来做这件事。

有没有人有好办法解决这个问题?

EN

回答 2

Stack Overflow用户

发布于 2013-07-28 14:56:23

问题不在于alembic,而在于您使用的MySQL,它不能回滚DDL语句。

因此,实现它的唯一(丑陋的)方法是进行手动异常处理,并反转在此之前成功的操作。

像这样的东西(从我的脑海中写出来的,所以它不是最优雅的解决方案,甚至可能有一点错误,但我希望你能理解要点):

代码语言:javascript
复制
def upgrade():
    try:
        op.create_table('sometable',
            Column('id', INTEGER, primary_key=True),
            Column('name', VARCHAR(150), nullable=False, unique=True))
    except:
        try:
            op.drop_table('sometable')
        except:
            pass
        raise

    try:
        op.add_column('anothertable' Column('id', INTEGER))
    except:
        op.drop_table('sometable')
        try:
            op.drop_column('anothertable', 'id')
        except:
            pass
        raise

    try:
        op.create_table('secondtable')
    except:
        op.drop_table('sometable')
        op.drop_column('anothertable', 'id')
        try:
            op.drop_table('secondtable')
        except:
            pass
        raise
票数 8
EN

Stack Overflow用户

发布于 2015-10-02 07:06:39

如果您对要从中迁移的数据库模型进行了版本控制,则可以临时使用它来创建迁移。(您可能必须清空版本文件夹/将所有内容放在临时目录中) Alembic会将数据库的当前状态与模型进行比较,并为数据库提供迁移命令以达到该状态。在这种情况下,它应该为您提供将数据库恢复到以前状态的说明。您必须查看生成的迁移命令,以确保它正是您所需要的,但您不需要自己生成它们。

之后,您可以删除迁移,并回滚到最新的数据库模型文件。那么你应该回到你开始的地方

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17894240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档