在Flask应用上下文中删除用户模型触发SQLAlchemy InvalidRequestError
解决SQLAlchemy对象已绑定到其他会话的删除错误
错误信息
sqlalchemy.exc.InvalidRequestError: Object '<User at 0x249c4a15290>' is already attached to session '3' (this is '4')
问题原因
你在路由里执行User.query.filter_by(id=user_id).first()时,已经处于Flask的请求上下文当中,查询出的User对象会自动绑定到当前请求对应的数据库会话(也就是错误里的session3)。但你额外用with app.app_context()创建了新的上下文,这个上下文里的数据库会话是session4,把绑定到session3的对象放到session4里操作,就会触发“对象已属于其他会话”的错误。
而且路由函数内部本身就处于请求上下文里,完全不需要手动创建app.app_context()——这个上下文是给路由外的代码(比如独立脚本、定时任务)用的,你之前的用法是错误的。
修正后的代码
@app.route("/user/<user_id>", methods=["DELETE"]) def delete_user(user_id): user = User.query.filter_by(id=user_id).first() if user: # 增加判断,避免用户不存在时执行删除报错 db.session.delete(user) db.session.commit() return {}
优化建议(可选)
如果需要处理用户不存在的情况,可以返回404状态码,让接口更规范:
from flask import abort @app.route("/user/<user_id>", methods=["DELETE"]) def delete_user(user_id): user = User.query.filter_by(id=user_id).first() if not user: abort(404, description="用户不存在") db.session.delete(user) db.session.commit() return {"message": "用户删除成功"}
内容的提问来源于stack exchange,提问作者Kamran Ul Haq
相关产品推荐
相关产品推荐

