gpt4 book ai didi

python - 如何清理不完整的 alembic 运行

转载 作者:太空狗 更新时间:2023-10-29 21:40:15 26 4
gpt4 key购买 nike

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

例子:

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”一样。不过我还是找不到这样做的办法。

谁有好的办法解决这个问题?

最佳答案

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

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

类似这样的事情(写在我的脑海里,所以它不是最优雅的解决方案,甚至可能有一点错误,但我希望你能理解要点):

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

关于python - 如何清理不完整的 alembic 运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17894240/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com