FastAPI升级后返回SQLAlchemy查询结果触发TypeError问题求助
解决FastAPI/Pydantic升级后SQLAlchemy查询结果序列化报错问题
升级FastAPI和Pydantic到最新版本后,SQLAlchemy通过with_entities查询返回的Row对象无法正常序列化,触发TypeError: vars() argument must have __dict__ attribute错误。这是因为Pydantic v2对序列化对象的要求更严格,不再自动兼容无__dict__属性的SQLAlchemy返回类型。
解决方案1:转换为字典列表
直接将查询结果中的每个Row对象转为字典,FastAPI可直接将字典序列化为JSON:
def get_all(db: Session): data = db.query(table).with_entities(table.id.label('id'), table.name.label('name')).all() return [row._asdict() for row in data]
_asdict()是SQLAlchemy Row对象(本质为namedtuple)的内置方法,能直接将字段转换为键值对字典。
解决方案2:使用Pydantic模型序列化(更规范)
定义对应返回结构的Pydantic模型,通过模型验证后返回,适合需要严格数据校验的场景:
from pydantic import BaseModel # 定义返回结构的Pydantic模型 class ItemResponse(BaseModel): id: int name: str def get_all(db: Session): data = db.query(table).with_entities(table.id.label('id'), table.name.label('name')).all() # 直接用Row对象实例化Pydantic模型 return [ItemResponse.model_validate(row) for row in data]
Pydantic v2支持直接从namedtuple/SQLAlchemy Row对象实例化模型,无需手动转字典。
原因说明
旧版本FastAPI/Pydantic对SQLAlchemy返回类型做了兼容处理,自动将其转换为可序列化格式。但升级到Pydantic v2后,这部分兼容逻辑被调整,要求返回对象必须具备__dict__属性,或是Pydantic模型、字典等标准可序列化类型。
内容的提问来源于stack exchange,提问作者Jyothish
相关产品推荐
相关产品推荐

