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
相关产品推荐
相关产品推荐

