You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 04:06:03