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

  • 2017-03-27
  • 1,939
  • 0
  • 2

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

评论

还没有任何评论,你来说两句吧

发表评论

*

浙ICP备16016405号-2
浙公网安备 33010602007544号