测试时Base=declarative_base(bind=engine)触发警告,如何迁移至SQLAlchemy 2.0?
迁移SQLAlchemy declarative_base至2.0版本解决RemovedIn20Warning
在SQLAlchemy 2.0中,declarative_base()已被标记为弃用,官方推荐使用新的声明式基类方案,以下是两种迁移方式:
方式一:使用DeclarativeBase类(推荐)
这是2.0版本的标准用法,直接继承DeclarativeBase创建你的基类:
from sqlalchemy.orm import DeclarativeBase from sqlalchemy import MetaData # 基础用法,后续在create_all时指定引擎 class Base(DeclarativeBase): pass # 初始化表结构 Base.metadata.create_all(bind=engine) # 可选:提前绑定引擎到metadata class Base(DeclarativeBase): metadata = MetaData(bind=engine) # 此时create_all可省略bind参数 Base.metadata.create_all()
你的模型类依然像之前一样继承这个Base类即可,完全兼容原有写法。
方式二:使用Registry(适用于多基类场景)
如果需要更灵活的映射控制(比如多个独立的声明式基类),可以使用registry:
from sqlalchemy.orm import registry # 创建registry实例 mapper_registry = registry() # 生成声明式基类 Base = mapper_registry.generate_base() # 初始化表结构,两种方式都可行 mapper_registry.metadata.create_all(bind=engine) # 或者 Base.metadata.create_all(bind=engine)
关键说明
- 原有的
declarative_base()在2.0中暂时仍可使用,但会触发RemovedIn20Warning,建议尽快迁移到新方案 - 模型类的定义逻辑无需修改,仅需替换基类的创建方式
metadata.create_all()的调用方式与之前完全兼容,无需额外调整
内容的提问来源于stack exchange,提问作者Selva Kumaresan Ramakrishnan
相关产品推荐
相关产品推荐

