FastAPI+SQLModel批量删除数据报错,求批量删除实现方案
批量删除匹配session_id的所有记录解决方案
问题场景
你的原始删除函数试图删除单个session记录,但扩展为批量删除所有匹配session_id的记录时,遇到两个错误:
- 使用
results.one()时抛出MultipleResultsFound: Multiple rows were found when exactly one was required:因为one()强制要求查询结果唯一,而实际存在多条匹配记录。 - 改为
results.all()后抛出sqlalchemy.orm.exc.UnmappedInstanceError: Class 'builtins.list' is not mapped:因为session.delete()只能接收单个ORM实例,无法直接处理列表对象。
另外你的原始代码存在隐性问题:数据库会话(session)的操作超出了with上下文范围,with块结束后会话已自动关闭,后续的delete和commit操作会失效。
解决方案一:查询后逐个删除(适合需先处理记录再删除的场景)
先查询所有匹配记录,再循环删除每个实例,所有操作必须放在会话上下文内部:
def delete_session(self, session_id: int, db): with Session(engine) as session: # 查询所有匹配session_id的记录 statement = select(db).where(db.session == session_id) results = session.exec(statement) sess_list = results.all() if not sess_list: raise HTTPException(status_code=404, detail="Session not found") # 遍历删除每条记录 for sess in sess_list: session.delete(sess) session.commit() return {"Session Deleted": True, "Deleted_Count": len(sess_list)}
解决方案二:直接执行批量删除语句(性能更优,推荐)
无需先加载所有记录到内存,直接生成批量删除SQL语句执行,效率更高:
from sqlalchemy import delete def delete_session(self, session_id: int, db): with Session(engine) as session: # 构建批量删除语句 delete_stmt = delete(db).where(db.session == session_id) # 执行删除并获取影响行数 result = session.execute(delete_stmt) session.commit() if result.rowcount == 0: raise HTTPException(status_code=404, detail="Session not found") return {"Session Deleted": True, "Deleted_Count": result.rowcount}
内容的提问来源于stack exchange,提问作者Talha Anwar
相关产品推荐
相关产品推荐

