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

Flask-SQLAlchemy删除数据库记录时报Instance not persisted错如何解决

错误成因
  • 核心原因是你删除的对象不是数据库持久化对象:你已经通过users.query.filter_by(name=user).first()查询到了和数据库记录绑定的found_user实例,后续却自己重新实例化了一个全新的usr对象,这个新对象仅存在于内存中,从来没有被写入过数据库,不属于SQLAlchemy的托管持久化实例,因此执行删除操作时会触发not persisted错误。
  • 额外逻辑漏洞:你在判断found_user是否存在之前就执行了email = found_user.email,如果查询不到匹配用户,这行代码会直接抛出空对象属性不存在的报错。
正确删除实现

修正后的业务逻辑代码如下,仅需修改POST请求分支的判断部分:

@app.route("/view", methods=["POST", "GET"])
def view():
    if "user" in session:
        user = session["user"]
        
        if request.method == "POST":
            user = request.form["nm"]
            session["user"] = user

            found_user = users.query.filter_by(name=user).first()
            # 先判断用户是否存在,再操作对象属性
            if found_user:
                # 直接删除查询到的持久化对象即可,无需新建实例
                db.session.delete(found_user)
                db.session.commit()
                flash("An Account has been Deleted!")
            else :
                flash("Name is not found")

        else:
            return render_template("view.html", values=users.query.all())

    else:
        flash("Please Login First")
        return redirect(url_for("login"))

如果不需要对查询到的用户对象做其他操作,也可以直接执行批量删除语法,省略查询步骤性能更高:

users.query.filter_by(name=user).delete()
db.session.commit()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 02:36:05