如何在Alembic中修改列索引并支持双向版本迁移
正确实现方式
你当前0020版本迁移的缺陷本质是downgrade()逻辑没有做逆向还原,只删除了新版本的非唯一索引,没有重建旧版本的唯一索引。修正后的迁移代码如下:
def upgrade(): # 升级流程:删除旧的唯一索引,创建非唯一索引 op.drop_index(op.f('ix_user_email'), table_name='users') op.create_index(op.f('ix_user_email'), 'users', ['email'], unique=False) def downgrade(): # 降级流程:删除新版本的非唯一索引,还原0019版本对应的唯一索引 op.drop_index(op.f('ix_user_email'), table_name='users') op.create_index(op.f('ix_user_email'), 'users', ['email'], unique=True)
编写迁移的注意事项
- 所有
drop_index操作建议显式传入table_name参数,避免在多schema、多数据库实例的场景下出现索引定位失败的问题 - 迁移的升降级逻辑必须严格对称:升级阶段执行的每一步结构修改,降级阶段都要执行完全对应的逆向操作,才能保证切换版本后数据库结构和版本定义完全匹配
- 执行降级操作前需要提前校验数据:从非唯一索引切回唯一索引时,必须确认
users表的email列没有重复值,否则会因为数据库唯一约束校验失败导致迁移中断
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

