Python SqlAlchemy - AttributeError:映射器 [英] 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')
我想通过以下方式实例化一个新会话:
I want to instantiate a new session through:
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)
我不知道这个错误是从哪里来的,我无法真正调试它..有人可以帮我解决这个问题吗?
I have no idea where this error is coming from and i can not really debug it.. anybody could help me with this issue?
谢谢和问候!
推荐答案
查看回溯,您可以看到以下几行:
Looking at the traceback you can see these lines:
...
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
...
这将您的问题缩小了很多.关系
which narrow your problem down quite a bit. The relationship
user = relationship('model.user.User', back_populates='sessions')
使用 Python 可评估字符串作为 参数,其用法在"配置关系":
uses a Python evaluable string as the argument, the use of which is further explained in "Configuring Relationships":
与其他类的关系以通常的方式完成,添加的特性是指定给 relationship()
的类可以是字符串名称.与Base
相关联的类注册表"在映射器编译时用于将名称解析为实际的类对象,一旦使用映射器配置,就会定义该名称
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 withBase
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
模块,则名称解析失败,因为类 User
尚未创建,在注册表中不存在.换句话说,名称解析工作时,必须定义所有类,这意味着它们的主体必须已被执行.
If you've not imported models.user
module anywhere before you try to instantiate a Session
object for the first time, then the name resolving fails because the class User
has not been created yet and does not exist in the registry. In other words for the name resolving to work, all classes must have been defined, which means that their bodies must have been executed.
如果您确实导入了 models.user
模块,请检查您的其他模型,并检查它们的相关模型类是否已定义.首次使用您的模型会触发映射器编译/配置,因此错误来源也可能是其他模型.
And if you actually have imported the models.user
module, check your other models and that their related model classes have been defined. Using your models for the first time triggers mapper compilation/configuration, so the source of the error could be other models as well.
这篇关于Python SqlAlchemy - AttributeError:映射器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!