SQLAlchemy的DetachedInstanceError与常规属性(不是关系)相关
SQLAlchemy的DetachedInstanceError与常规属性(不是关系)相关
我刚开始使用SQLAlchemy,遇到了DetachedInstanceError的问题,但是在任何地方都找不到太多关于这个问题的信息。我在一个会话之外使用了实例,所以如果关系没有被加载,SQLAlchemy自然无法加载任何关系,然而,我正在访问的属性并不是一个关系,事实上,这个对象根本没有关系。我找到了一些解决方案,比如急切加载,但我不能应用它,因为这不是一个关系。我甚至在关闭会话之前尝试了"touching"这个属性,但是它仍然无法防止异常的发生。即使之前已经成功访问过一次,为什么非关系属性仍然会引发这个异常呢?非常感谢帮助我调试这个问题的任何帮助。与此同时,我会试图得到一个可重现的独立场景,并在这里更新。
更新:这是带有几个堆栈的实际异常消息:
File "/home/hari/bin/lib/python2.6/site-packages/SQLAlchemy-0.6.1-py2.6.egg/sqlalchemy/orm/attributes.py", line 159, in __get__ return self.impl.get(instance_state(instance), instance_dict(instance)) File "/home/hari/bin/lib/python2.6/site-packages/SQLAlchemy-0.6.1-py2.6.egg/sqlalchemy/orm/attributes.py", line 377, in get value = callable_(passive=passive) File "/home/hari/bin/lib/python2.6/site-packages/SQLAlchemy-0.6.1-py2.6.egg/sqlalchemy/orm/state.py", line 280, in __call__ self.manager.deferred_scalar_loader(self, toload) File "/home/hari/bin/lib/python2.6/site-packages/SQLAlchemy-0.6.1-py2.6.egg/sqlalchemy/orm/mapper.py", line 2323, in _load_scalar_attributes (state_str(state))) DetachedInstanceError: 实例未绑定到会话;属性刷新操作无法进行
部分模型如下:
metadata = MetaData() ModelBase = declarative_base(metadata=metadata) class ReportingJob(ModelBase): __tablename__ = 'reporting_job' job_id = Column(BigInteger, Sequence('job_id_sequence'), primary_key=True) client_id = Column(BigInteger, nullable=True)
导致这个异常的字段client_id的使用方式如下:
查询:
jobs = session \ .query(ReportingJob) \ .filter(ReportingJob.job_id == job_id) \ .all() if jobs: # FIXME(Hari): Workaround for the attribute getting lazy-loaded. jobs[0].client_id return jobs[0]
这就是在会话范围之外触发异常的地方:
msg = msg + ", client_id: %s" % job.client_id