FastAPI+Alembic排除Celery表问题:迁移文件误删已有Celery表
解决Alembic自动生成删除Celery后端表的问题
方案1:在Alembic配置里排除指定表
打开alembic/env.py,找到run_migrations_online函数,在context.configure中添加include_object参数,自定义过滤逻辑让Alembic忽略这两个Celery表:
def run_migrations_online(): # 保留原有代码,在context.configure里新增配置 with connectable.connect() as connection: context.configure( connection=connection, target_metadata=target_metadata, # 过滤Celery的任务元数据表 include_object=lambda obj, name, type_, reflected, compare_to: not (type_ == "table" and name in {"celery_taskmeta", "celery_tasksetmeta"}) ) with context.begin_transaction(): context.run_migrations()
配置后Alembic不会将这两个表判定为“多余表”,也就不会生成删除操作。
方案2:给Celery表添加空模型映射
如果不想修改Alembic配置,可在SQLAlchemy模型文件中添加这两个表的映射,让Alembic识别它们为项目合法表:
from sqlalchemy import MetaData, Table from your_app import db # 替换为你项目的db实例或engine # 自动从数据库加载表结构,无需手动定义字段 celery_taskmeta = Table( 'celery_taskmeta', db.metadata, autoload_with=db.engine ) celery_tasksetmeta = Table( 'celery_tasksetmeta', db.metadata, autoload_with=db.engine )
将该模型加入Alembic的target_metadata后,autogenerate就不会生成删除这两个表的代码。
方案3:手动清理迁移文件
如果前两个方案无效,最直接的方式是每次生成迁移文件后,手动删除upgrade函数中删除这两个表的代码段,比如删掉以下内容:
op.drop_table('celery_taskmeta') op.drop_table('celery_tasksetmeta')
删除后再执行迁移即可,缺点是每次生成迁移都需要手动处理。
内容的提问来源于stack exchange,提问作者Leyla Karzand
相关产品推荐
相关产品推荐

