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

FastAPI中PUT接口数据更新操作未正常生效问题

问题根因

接口更新不生效是三个代码错误导致的:

  • 路径参数id未声明类型,FastAPI默认将路径解析出的id处理为字符串,和数据库模型中通常为整型的主键做匹配时,过滤条件无法命中任何记录
  • SQLAlchemy的update()方法仅接受字典结构的字段映射参数,直接传入Pydantic模型实例request时,ORM无法解析待更新的字段键值对
  • 缺少待更新记录的存在性校验,匹配不到数据时不会抛出明确错误,只会静默失败;最后返回数据库会话对象db无实际业务意义
修复代码
from fastapi import HTTPException, status

@app.put("/blog/{id}", status_code=status.HTTP_202_ACCEPTED)
def update(id: int, request: schemas.Blog, db: Session = Depends(get_db)):
    blog_query = db.query(models.Blog).filter(models.Blog.id == id)
    # 校验博客是否存在
    if not blog_query.first():
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail=f"对应ID {id} 的博客不存在"
        )
    # 传入字典格式的更新参数,synchronize_session=False避免会话同步警告
    blog_query.update(request.dict(exclude_unset=True), synchronize_session=False)
    db.commit()
    # 返回更新完成的博客数据
    return blog_query.first()
关键调整说明
  • 给路径参数id加类型标注id: int,FastAPI会自动做路径参数类型校验和转换,匹配数据库整型主键
  • 调用request.dict(exclude_unset=True)将Pydantic请求体转为字典,exclude_unset=True保证仅更新前端实际传递的字段,不会把未传字段覆盖为默认值
  • 增加存在性校验,找不到对应记录时直接返回404明确错误
  • 调整返回值为更新后的实际博客记录,而非无意义的数据库会话对象

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:51:20