Python SqlAlchemy-AttributeError: mapper
orm falcon (1)
basado en mi modelo:
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'')
Quiero instanciar una nueva sesión a través de:
session = Session(token=''test-token-123'')
Pero tengo:
AttributeError: mapper
La pila completa:
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)
No tengo idea de dónde viene este error y realmente no puedo depurarlo ... ¿alguien podría ayudarme con este problema?
Gracias y saludos!
Mirando el traceback puedes ver estas líneas:
...
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
...
que reduce el problema un poco. La relación
user = relationship(''model.user.User'', back_populates=''sessions'')
utiliza una cadena evaluable de Python como argumento , cuyo uso se explica con más detalle en "Configuración de relaciones" :
Las relaciones con otras clases se realizan de la manera habitual, con la característica adicional de que la clase especificada para
relationship()
puede ser un nombre de cadena. El "registro de clase" asociado conBase
se usa en el tiempo de compilación del correlacionador para resolver el nombre en el objeto de clase real, que se espera que se haya definido una vez que se utiliza la configuración del asignador.
Si no ha importado el módulo models.user
cualquier lugar antes de intentar crear una instancia de un objeto Session
por primera vez, la resolución del nombre falla porque el User
la clase aún no se ha creado y no existe en el registro. En otras palabras, para que el nombre se resuelva, todas las clases deben haberse definido, lo que significa que sus cuerpos deben haberse ejecutado.
Y si realmente ha importado el módulo models.user
, verifique sus otros modelos y que sus clases de modelo relacionadas hayan sido definidas. El uso de sus modelos por primera vez activa la compilación / configuración del mapeador, por lo que la fuente del error podría ser también otros modelos .