【问题标题】:fastAPI SQLmodel MultipleResultsFound: Multiple rows were found when exactly one was requiredfastAPI SQLmodel MultipleResultsFound:当恰好需要一行时找到多行
【发布时间】:2023-01-31 21:06:21
【问题描述】:

这是我的删除功能。

def delete_session(self,session_id: int, db):
        with Session(engine) as session:
            statement = select(db).where(db.session == session_id)
            results = session.exec(statement)
            sess = results.one()
            print("sess: ", sess)
        if not sess:
            raise HTTPException(status_code=404, detail="Session not found")
        session.delete(sess)
        session.commit()
        return {"Session Deleted": True}

我想删除 session_id 匹配的所有记录。 但它抛出以下错误 MultipleResultsFound: Multiple rows were found when exactly one was required

我怎样才能一次删除多行。

我尝试使用

sess = results.all()

但它说

sqlalchemy.orm.exc.UnmappedInstanceError: Class 'builtins.list' is not mapped

谢谢

【问题讨论】:

    标签: fastapi sqlmodel


    【解决方案1】:

    当前,您正在尝试删除多个数据项,但 session.delete() 仅采用单个值,而不是值列表。

    您正在使用 results.one() 可能认为您可以隔离您的答案并只返回一个。但是,文档中解释说,如果在传递给 one() 的参数中找到多个条目,那么它将抛出 MultipleResultsFound 异常,因此会出现错误。

    实际上,您的语句返回一个列表,因此有多个值。

    为了删除所有元素,您不应使用one(),而只需在results上使用for循环进行迭代,并逐一删除您的数据,如下所示:

    
    def delete_session(self, session_id: int, db):
        with Session(engine) as session:
            statement = select(db).where(db.session == session_id)
            results = session.exec(statement).all()
            for sess in results:
                session.delete(sess)
        session.commit()
        return {"Session Deleted": True}
    
    

    【讨论】:

      猜你喜欢
      • 2021-07-26
      • 2017-01-25
      • 2014-10-12
      • 2016-12-10
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      相关资源
      最近更新 更多