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

FastAPI+SQLAlchemy查询接口触发Pydantic ValidationError求助

问题:GET路由返回数据触发Pydantic验证错误

我开发了一个GET路由/users/userMatch/{idusuariobuscar},当传入参数2时,预期返回数据库中对应的9和4,但触发了验证错误,错误提示idUsuario和idPartido字段缺失。


相关代码与结构

路由代码

@userRoutes.get(
    "/users/userMatch/{idusuariobuscar}",
    response_model=list[PartidosUser],
    tags=["users"],
)
def get_user_matches(idusuariobuscar: str):
    return conn.execute(
        partidosusuarios.select(partidosusuarios.c.idpartido).where(
            partidosusuarios.c.idusuario == idusuariobuscar
        )
    ).fetchall()

PartidosUser模型

class PartidosUser(BaseModel):
    id: Optional[str]
    idUsuario: str
    idPartido: str

    class Config:
        orm_mode = True

数据库表结构

partidosusuarios = Table(
    "partidosusuarios",
    meta,
    Column("idrelacion", Integer, primary_key=True),
    Column("idpartido", Integer),
    Column(
        "idusuario",
        Integer,
    ),
)

错误信息

raise ValidationError(errors, field.type_)
pydantic.error_wrappers.ValidationError: 4 validation errors for PartidosUser
response -> 0 -> idUsuario
  field required (type=value_error.missing)
response -> 0 -> idPartido
  field required (type=value_error.missing)
response -> 1 -> idUsuario
  field required (type=value_error.missing)
response -> 1 -> idPartido
  field required (type=value_error.missing)

解决方案

问题根源

  1. 查询字段不全:SQL查询只返回了idpartido字段,但模型要求idUsuario和idPartido都要有,结果里缺了idUsuario;另外数据库字段名是小写的idusuario、idpartido,和模型的驼峰命名不匹配,导致ORM无法正确映射。
  2. 参数类型不匹配:数据库里idusuario是整数类型,但路由参数定义成了字符串,可能引发类型转换问题。

修复步骤

  1. 修改查询语句:返回模型需要的所有字段,直接查询整行记录即可:
def get_user_matches(idusuariobuscar: int):
    return conn.execute(
        partidosusuarios.select().where(
            partidosusuarios.c.idusuario == idusuariobuscar
        )
    ).fetchall()
  1. 统一字段名映射:两种方式二选一:

    • 方式一:修改模型字段名和数据库一致:
      class PartidosUser(BaseModel):
          id: Optional[str] = None
          idusuario: str
          idpartido: str
      
          class Config:
              orm_mode = True
      
    • 方式二:用Field指定别名,保留驼峰命名:
      from pydantic import Field
      
      class PartidosUser(BaseModel):
          id: Optional[str] = None
          idUsuario: str = Field(alias="idusuario")
          idPartido: str = Field(alias="idpartido")
      
          class Config:
              orm_mode = True
              allow_population_by_field_name = True
      
  2. 修正参数类型:把路由参数idusuariobuscar的类型从str改成int,和数据库字段类型匹配。

内容的提问来源于stack exchange,提问作者JustANoobCoder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 04:05:14