如何在alembic迁移中处理异常?

1 投票
1 回答
1842 浏览
提问于 2025-04-18 08:50

我有一个叫做 alembic 的迁移脚本,我想加一些异常处理,但不太确定怎么做才是最佳的做法。

基本上,我有几个问题需要处理:

  1. 已经做过的更改不需要再做(比如说,如果我尝试添加一个列,而这个列已经存在了,我希望程序能继续运行,不要报错)
  2. 表被锁定(如果我尝试对一个表进行操作,但这个表被锁住了,我希望能抛出一个异常,提醒我)
  3. 还有其他的异常吗?

    def upgrade():
        engine = op.get_bind().engine
        op.add_column('t_break_employee', sa.Column('auto', sa.Boolean()))
        op.add_column('t_employee', sa.Column('settings', sa.Text()))
    

我考虑过在每次更改时使用一个类,配合 'with' 语句来处理。这听起来合理吗?

例如:

    def upgrade():
        engine = op.get_bind().engine
        with my_test():
            op.add_column('t_break_employee', sa.Column('auto', sa.Boolean()))
        with my_test():
            op.add_column('t_employee', sa.Column('settings', sa.Text()))

在这种情况下,我需要处理哪些异常?我怎么知道一个表是否被锁定了呢?

1 个回答

1

我不是在说你使用的API的具体问题,但我不建议你这样做。

其实,迁移(也就是把数据从一个地方转移到另一个地方)有两种结果:

  • 迁移成功了
  • 数据库回到了迁移之前的状态(这说明出现了某种错误)。

处理错误的正确方法是修复迁移。你现在的做法可能会导致第三种结果:

  • 迁移失败了,但有些更改已经被应用了

这样会导致数据库结构损坏,这可不好!

撰写回答