SQLAlchemy的DetachedInstanceError与常规属性(不是关系)相关

8 浏览
0 Comments

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

0