Jarvis's Blog

白帽子、全栈、IoT安全专家、嵌入式系统专家

使用flask+sqlalchemy操作数据库报错:is already attached to session的解决办法

第一次用flask+sqlalchemy,之前解决了配置之类的问题,今天在用ORM进行CURD操作的时候,在视图函数里操作数据库的时候会报错:
sqlalchemy.exc.InvalidRequestError: Object ” is already attached to session ‘1’ (this is ‘2’)
我的视图控制器是这样写的:

@app.route('/deldevice.json')
def deldevice():
    deviceid = request.args.get('id');
    dev = models.Device.query.filter_by(id=deviceid).first()
    db.session.delete(dev)
    db.session.commit()
    return redirect("/")

执行到db.session.delete(dev)的时候就会出现上面的报错了,后来网上查阅了一些资料,大概明白了原理,由于视图函数是一个多线程执行的函数,如果直接使用文件中的db变量,会造成会话绑定混乱,就会报这个错误,这是对程序执行流程理解不当造成的,那如何解决呢,有一个办法就是在函数内部import变量,就没有问题了,比如改成这样:

@app.route('/deldevice.json')
def deldevice():
    from xxxx import db as thisdb
    deviceid = request.args.get('id');
    dev = models.Device.query.filter_by(id=deviceid).first()
    thisdb.session.delete(dev)
    thisdb.session.commit()
    return redirect("/")

测试不报错,正常执行。

当然这个错误也告诉我们一个道理,尽量将功能模块化,不要把太多事务代码写在视图控制器里,1不方便维护,2也有可能造成一些不可预料的问题。

[pwnable.kr]Rookiss Writeup合集

上一篇

启程,谢幕

下一篇
评论
发表评论 说点什么
还没有评论
3669
0

    浙公网安备 33011002014706号