1

私のモデルに基づいて:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship

Base = declarative_base()

class Session(Base):
    __tablename__ = 'sessions'

    id = Column(Integer, primary_key=True)
    token = Column(String(200))
    user_id = Column(Integer, ForeignKey('app_users.id'))
    user = relationship('model.user.User', back_populates='sessions')

次の方法で新しいセッションをインスタンス化したいと考えています。

session = Session(token='test-token-123')

しかし、私は得る:

AttributeError: mapper

完全なスタック トレース:

Traceback (most recent call last):
  File "/home/ubuntu/.local/lib/python3.5/site-packages/falcon/api.py", line 227, in __call__
    responder(req, resp, **params)
  File "./app_user/register.py", line 13, in on_post
    session = Session(token='test-token-123')
  File "<string>", line 2, in __init__
  File "/home/ubuntu/.local/lib/python3.5/site-packages/sqlalchemy/orm/instrumentation.py", line 347, in _new_state_if_none
    state = self._state_constructor(instance, self)
  File "/home/ubuntu/.local/lib/python3.5/site-packages/sqlalchemy/util/langhelpers.py", line 764, in __get__
    obj.__dict__[self.__name__] = result = self.fget(obj)
  File "/home/ubuntu/.local/lib/python3.5/site-packages/sqlalchemy/orm/instrumentation.py", line 177, in _state_constructor
    self.dispatch.first_init(self, self.class_)
  File "/home/ubuntu/.local/lib/python3.5/site-packages/sqlalchemy/event/attr.py", line 256, in __call__
    fn(*args, **kw)
  File "/home/ubuntu/.local/lib/python3.5/site-packages/sqlalchemy/orm/mapper.py", line 2976, in _event_on_first_init
    configure_mappers()
  File "/home/ubuntu/.local/lib/python3.5/site-packages/sqlalchemy/orm/mapper.py", line 2872, in configure_mappers
    mapper._post_configure_properties()
  File "/home/ubuntu/.local/lib/python3.5/site-packages/sqlalchemy/orm/mapper.py", line 1765, in _post_configure_properties
    prop.init()
  File "/home/ubuntu/.local/lib/python3.5/site-packages/sqlalchemy/orm/interfaces.py", line 184, in init
    self.do_init()
  File "/home/ubuntu/.local/lib/python3.5/site-packages/sqlalchemy/orm/relationships.py", line 1653, in do_init
    self._process_dependent_arguments()
  File "/home/ubuntu/.local/lib/python3.5/site-packages/sqlalchemy/orm/relationships.py", line 1710, in _process_dependent_arguments
    self.target = self.mapper.mapped_table
  File "/home/ubuntu/.local/lib/python3.5/site-packages/sqlalchemy/util/langhelpers.py", line 850, in __getattr__
    return self._fallback_getattr(key)
  File "/home/ubuntu/.local/lib/python3.5/site-packages/sqlalchemy/util/langhelpers.py", line 828, in _fallback_getattr
    raise AttributeError(key)

このエラーがどこから来ているのかわからず、実際にデバッグすることはできません..誰かがこの問題を手伝ってくれますか?

感謝と挨拶!

4

1 に答える 1

8

トレースバックを見ると、次の行が表示されます。

  ...
  File "/home/ubuntu/.local/lib/python3.5/site-packages/sqlalchemy/orm/relationships.py", line 1653, in do_init
    self._process_dependent_arguments()
  File "/home/ubuntu/.local/lib/python3.5/site-packages/sqlalchemy/orm/relationships.py", line 1710, in _process_dependent_arguments
    self.target = self.mapper.mapped_table
  ...

これにより、問題がかなり絞り込まれます。関係

    user = relationship('model.user.User', back_populates='sessions')

Python の評価可能な文字列を引数として使用します。その使用方法については、 「関係の構成」で詳しく説明します。

他のクラスとの関係は通常の方法で行われますが、指定されたクラスrelationship()が文字列名である可能性があるという機能が追加されています。関連付けられた「クラス レジストリ」Baseは、マッパーのコンパイル時に使用され、名前を実際のクラス オブジェクトに解決します。これは、マッパー構成が使用されると定義されると予想されます。

初めてオブジェクトmodels.userをインスタンス化する前にモジュールをどこにもインポートしていない場合、クラスがまだ作成されておらず、レジストリに存在しないため、名前解決は失敗します。つまり、名前解決が機能するためには、すべてのクラスが定義されている必要があります。つまり、それらの本体が実行されている必要があります。SessionUser

実際にモジュールをインポートした場合はmodels.user、他のモデルをチェックし、関連するモデル クラスが定義されていることを確認してください。モデルを初めて使用すると、マッパーのコンパイル/構成がトリガーされるため、エラーの原因は他のモデルでもある可能性があります。

于 2017-08-07T05:48:13.310 に答える