SqlAlchemy的问题 - “父实例<someclass>未绑定到Session;延迟加载操作......”</someclass>

时间:2010-11-23 05:52:10

标签: python sqlalchemy

我在python中有一个小型的thrift服务器,我用它做一些快速查找。服务器在第一个请求时通过SqlAlchemy查询mysql,并将所有返回的对象推送到字典中,以便在后续请求中不需要DB调用。我只是从dict中获取对象,然后调用一些对象方法来提供正确的响应。

最初,一切都很好。但是,在服务器运行一段时间后,我在访问sqlalchemy对象方法时遇到此异常:

  
    

父实例未绑定到Session;属性'rate'的延迟加载操作无法继续。

  

奇怪,因为我设置了eagerload('rate')

我无法真正看到这种行为的模式,它只会影响某些对象。但是,一旦它确实影响了一个对象,它将继续在每个请求上执行此操作,直到我重新启动我的python服务器。

有什么想法吗?

1 个答案:

答案 0 :(得分:9)

您可能在请求之间缓存对象,并且在提交发生时,会话对象被清除,使对象无效。如果您通过某个多线程Web服务器启动服务器,该服务器根据需要启动工作程序,这就解释了为什么没有模式。 如果你不想深究这一点,只需要快速修复,这将始终有效:

if obj not in session:
    obj = session.query(ObjClass).get(obj.id)

正确的解决方案是确保不在请求之间缓存对象。