代码之家  ›  专栏  ›  技术社区  ›  Creative crypter

Python SqlAlchemy-AttributeError:mapper

  •  1
  • Creative crypter  · 技术社区  · 8 年前

    根据我的模型:

    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)
    

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

    谢谢和问候!

    1 回复  |  直到 7 年前
        1
  •  8
  •   Ilja Everilä    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可计算字符串作为 argument ,其使用将在中进一步解释 "Configuring Relationships"

    relationship() 可以是字符串名称。与关联的类注册表 Base 一旦使用映射器配置,预计已定义

    models.user 在您尝试实例化 Session 对象,则名称解析失败,因为类 User 尚未创建,并且注册表中不存在。换句话说,为了使名称解析有效,所有类都必须已定义,这意味着它们的主体必须已执行。

    型号.用户 其他型号