1

再現するのが非常に難しい、非常に奇妙なバグに遭遇しました: AttributeError: 'list' object has no attribute '_sa_adapter'. 1 対多の関係によるものと思われますが、すべて問題ないようで、単純にバグを再現することはできません。テスト スイートを単独で実行した場合、バグはなく、テスト全体を実行した場合にのみ発生します。掃除が行き届いていないことが原因なのかもしれません...

完全なスタックは次のとおりです。

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'

それがどこから来るのか知っていますか?

ありがとう、

チャンネル

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

私の場合は、別のスレッド(スケジューラー1)で別のセッションがまだ開いています。そのため、ジョブがアクティブ化された後にそのスレッドがセッションを閉じ、http サーバースレッドが魅力的に機能します。

于 2017-03-25T08:57:00.260 に答える