2017-08-06 73 views
0

基于我的模型:Python的SQLAlchemy的 - AttributeError的:映射

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 

全stacktrace:

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

错误来自用户关系配置,但为什么不清楚。 'self.mapper'是解析给定的[argument]关系的memoized属性(http://docs.sqlalchemy.org/en/latest/orm/relationship_api.html#sqlalchemy.orm.relationship.params.argument) ,但出于某种原因,这对于您使用AttributeError失败。我猜想[解决部分路径]'model.user中存在一些问题(http://docs.sqlalchemy.org/en/latest/orm/extensions/declarative/relationships.html#declarative-configuring-relationships)。 User'。 –

+1

相关:https://stackoverflow.com/questions/44688346/vague-flask-sqlalchemy-error-attributeerror-mapper和https://stackoverflow.com/questions/33161280/sqlalchemy-instantiate-object-from-orm-fails -with-attributeerror-mapper –

+1

我怀疑你在尝试实例化Session对象之前,没有在任何地方导入过'model.user.User'类。换句话说,尽管类定义存在,但它尚未运行。例如,如果我将例子分割为'model.base.Base','model.session.Session',一个虚拟'model.user.User'和一个主要函数**,它只导入'Session' **并尝试使用它,引发异常。另一方面,如果在使用模型之前,您在某处导入了'Session'和'User',这样就可以执行这两个类定义。 –

回答

3

寻找你可以看到这几行:

... 
    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"进一步解释:

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

如果您还没有进口models.user模块任何地方,你尝试实例化一个前Session对象,则名称解析失败,因为类User尚未创建并且不存在于注册表中。换句话说,为了解决名称的工作问题,所有类都必须被定义,这意味着他们的身体必须已经被执行。

而且,如果您实际上已导入models.user模块,请检查您的其他模型,并确定其相关模型类已定义。首次使用您的模型触发映射器编译/配置,因此错误的来源也可能是其他型号