FastAPI实现:通过ID或唯一名称PUT更新整行数据
问题修复与PUT接口实现方案
一、修复单个玩家查询接口
原代码仅构建了查询对象,未执行实际查询,也未处理玩家不存在的场景,修改后的代码如下:
from fastapi import HTTPException @app.get("/players/{player_id}", response_model=PlayerModel) async def read_player(db: db_dependency, player_id: int): player = db.query(models.Player).filter_by(id=player_id).first() if not player: raise HTTPException(status_code=404, detail="玩家不存在") return player
核心修改点:
- 新增
.first()执行查询,获取单个玩家数据 - 添加404异常处理,符合RESTful接口规范
二、PUT更新接口实现
根据你的React应用场景(输入玩家名称更新is_active),同时提供通用整行更新方案:
方案1:按玩家名称更新活跃状态(适配React场景)
from pydantic import BaseModel # 定义仅用于更新活跃状态的请求模型 class PlayerActiveUpdate(BaseModel): active: bool @app.put("/players/name/{player_name}", response_model=PlayerModel) async def update_player_active_by_name(db: db_dependency, player_name: str, update_data: PlayerActiveUpdate): player = db.query(models.Player).filter_by(name=player_name).first() if not player: raise HTTPException(status_code=404, detail="玩家不存在") player.active = update_data.active db.commit() db.refresh(player) return player
方案2:按ID更新整行玩家数据(通用更新场景)
如果需要支持修改玩家名称等其他字段,可使用该方案:
from pydantic import BaseModel, Optional # 定义支持部分字段更新的模型 class PlayerUpdate(BaseModel): name: Optional[str] = None active: Optional[bool] = None @app.put("/players/{player_id}", response_model=PlayerModel) async def update_player_by_id(db: db_dependency, player_id: int, update_data: PlayerUpdate): player = db.query(models.Player).filter_by(id=player_id).first() if not player: raise HTTPException(status_code=404, detail="玩家不存在") # 仅更新请求中提供的字段 for key, value in update_data.dict(exclude_unset=True).items(): setattr(player, key, value) db.commit() db.refresh(player) return player
注意事项
- 所有更新操作必须调用
db.commit()提交事务,db.refresh()用于同步数据库最新数据返回给客户端 - 必须处理资源不存在的情况,避免返回空数据或引发内部错误
- 方案2中
exclude_unset=True确保只更新请求里明确提供的字段,不会覆盖未修改的原有值
内容的提问来源于stack exchange,提问作者Maru
相关产品推荐
相关产品推荐

