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

