使用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也有可能造成一些不可预料的问题。