Python SqlAlchemy - AttributeError: mapper

Python SqlAlchemy - AttributeError: mapper

基于我的模型:

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)

我不知道这个错误是从哪里来的,我无法真正调试它。有人可以帮我解决这个问题吗?

谢谢和问候!

查看回溯,您可以看到这些行:

  ...
  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 可计算字符串作为 argument, the use of which is further explained in "Configuring Relationships":

Relationships to other classes are done in the usual way, with the added feature that the class specified to relationship() may be a string name. The “class registry” associated with Base is used at mapper compilation time to resolve the name into the actual class object, which is expected to have been defined once the mapper configuration is used

如果您在第一次尝试实例化 Session 对象之前没有在任何地方导入 models.user 模块,那么名称解析会失败,因为 class User 尚未创建且不存在于注册表中。换句话说,要使名称解析起作用,必须定义所有 classes,这意味着它们的主体必须已执行。

并且如果您确实导入了 models.user 模块,请检查您的其他模型以及它们的相关模型 class 是否已定义。首次使用您的模型会触发映射器 compilation/configuration,因此错误来源也可能是 其他模型