【SQLAlchemy】is not bound to a Session; attribute refresh operation cannot proceed

参考:https://segmentfault.com/q/1010000004530775

SQLAlchemy的ORM方式将数据库中的记录映射成了我们定义好的模型类,但是带来一个问题是,这些类对象的实例只在数据库会话(session)的生命期内有效,假如我将数据库会话关闭了,再访问数据表类的对象就会报错。

可能有的人会说,那你不要关闭数据库会话呀,会话关闭了对象当然就无法访问了,因为ORM需要跟踪这个对象,并缓存一些你对它的操作以便在需要时更新到数据库去的,它不是一个简单的对象。

但我现在的需求是:从数据库中查询得到了一个对象实例之后,就想让这个对象与数据库切断联系,SQLAlchemy有提供这样的方法吗?我必须定义一个具有同样成员的类然后再初始化它?

解决方式1

在这里插入图片描述


解决方式2

错误写法:

def query_increase_decrease_url_all():
    session = Session()
    try:
        increase_decrease_url_all = session.query(Increase_decrease_url).all()
        curlogger.info('increase_decrease_url_all = '+str(increase_decrease_url_all))
        return increase_decrease_url_all
    except Exception as e:
        curlogger.error(e)
        traceback.print_exc()
    finally:
        session.commit()  // 这里不需要commit
        session.close()

正确:(不进行操作,就不commit,不需要在后续操作中保持session连接)

def query_increase_decrease_url_all():
    session = Session()
    try:
        increase_decrease_url_all = session.query(Increase_decrease_url).all()
        curlogger.info('increase_decrease_url_all = '+str(increase_decrease_url_all))
        return increase_decrease_url_all
    except Exception as e:
        curlogger.error(e)
        traceback.print_exc()
    finally:
        session.close()
发布了574 篇原创文章 · 获赞 203 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/sinat_42483341/article/details/104067653
今日推荐