1

我遇到了一个非常奇怪的错误,很难重现:AttributeError: 'list' object has no attribute '_sa_adapter'. 它似乎来自一对多的关系,但一切看起来都很好,我不能简单地重现这个错误。如果我单独运行测试套件,就没有错误,它只会在整个测试运行时发生。也许它来自没有正确清洁的东西......

这是完整的堆栈:

Traceback (most recent call last):
  File "/Users/ca/[REDACTED].py", line 79, in setUp
    self.client.save()
  File "/Users/ca/[REDACTED].py", line 370, in save
    Session.add(self)
  File "/Users/ca/.pythonbrew/venvs/Python-2.7.3/api/lib/python2.7/site-packages/SQLAlchemy-0.7.5-py2.7-macosx-10.7-x86_64.egg/sqlalchemy/orm/scoping.py", line 113, in do
    return getattr(self.registry(), name)(*args, **kwargs)
  File "/Users/ca/.pythonbrew/venvs/Python-2.7.3/api/lib/python2.7/site-packages/SQLAlchemy-0.7.5-py2.7-macosx-10.7-x86_64.egg/sqlalchemy/orm/session.py", line 1223, in add
    self._save_or_update_state(state)
  File "/Users/ca/.pythonbrew/venvs/Python-2.7.3/api/lib/python2.7/site-packages/SQLAlchemy-0.7.5-py2.7-macosx-10.7-x86_64.egg/sqlalchemy/orm/session.py", line 1238, in _save_or_update_state
    halt_on=self._contains_state):
  File "/Users/ca/.pythonbrew/venvs/Python-2.7.3/api/lib/python2.7/site-packages/SQLAlchemy-0.7.5-py2.7-macosx-10.7-x86_64.egg/sqlalchemy/orm/mapper.py", line 1814, in cascade_iterator
    parent_dict, visited_states, halt_on))
  File "/Users/ca/.pythonbrew/venvs/Python-2.7.3/api/lib/python2.7/site-packages/SQLAlchemy-0.7.5-py2.7-macosx-10.7-x86_64.egg/sqlalchemy/orm/properties.py", line 817, in cascade_iterator
    get_all_pending(state, dict_)
  File "/Users/ca/.pythonbrew/venvs/Python-2.7.3/api/lib/python2.7/site-packages/SQLAlchemy-0.7.5-py2.7-macosx-10.7-x86_64.egg/sqlalchemy/orm/attributes.py", line 775, in get_all_pending
    current = getattr(current, '_sa_adapter')
AttributeError: 'list' object has no attribute '_sa_adapter'

你知道它可能来自哪里吗?

谢谢,

chx

4

3 回答 3

4

这意味着您正在不恰当地操纵一个仪器化的对象 - 例如说,myobject.__dict__[somekey] = [1, 2, 3]. __dict__映射对象不支持直接操作。

于 2012-08-06T03:08:32.893 回答
4

旧线程,但对于以后查看的任何人,您要确保您的值正在通过setattr,以便 SA 的映射有机会拦截。所以你可以这样做:

obj.attr = myval

或者

setattr(obj, 'attr', myval)
于 2015-03-06T23:23:27.910 回答
0

我的情况是另一个会话仍在其他线程(调度程序一个)中打开。所以,我让那个线程在作业被激活并且 http 服务器线程像一个魅力一样工作后关闭会话。

于 2017-03-25T08:57:00.260 回答