SqlAlchemy问题 - “父实例<SomeClass>未绑定到会话; 延迟加载操作...”
我有一个用Python写的小型Thrift服务器,主要用来快速查找数据。这个服务器在第一次请求时通过SqlAlchemy查询MySQL数据库,然后把所有返回的对象放进一个字典里。这样在后续的请求中就不需要再访问数据库了,我只需从字典中获取对象,然后调用一些对象的方法来给出正确的响应。
最开始一切都很顺利。但是,服务器运行一段时间后,我在访问SqlAlchemy对象的方法时遇到了一个异常:
父实例没有绑定到会话;属性'rate'的懒加载操作无法进行。
这很奇怪,因为我已经设置了eagerload('rate')
。
我真的看不出这种行为有什么规律,它只影响某些对象。不过,一旦某个对象受到影响,每次请求时都会出现这个问题,直到我重启Python服务器。
有没有什么想法?
1 个回答
10
你可能在请求之间缓存了一些对象,当提交操作发生时,session对象会被清空,这样就导致你的对象失效了。如果你是通过一个多线程的网络服务器启动你的服务器,而这个服务器会根据需要启动工作进程,这就能解释为什么会没有规律可循。
如果你不想深入了解这个问题,只想要一个快速的解决办法,这个方法总是有效的:
if obj not in session:
obj = session.query(ObjClass).get(obj.id)
正确的解决方案是确保你在请求之间不要缓存对象。