python - Error de relación SQLAlchemy: el objeto no tiene atributo ''c''
orm python-2.6 (1)
no puedes decir esto
Venues = relation(''Venue'', primaryjoin=''EventType.id==Event.event_type_id'', secondary=Event, secondaryjoin=''Event.venue_id==Venue.id'')
necesitarías decir esto:
Venues = relation(''Venue'', primaryjoin=''EventType.id==Event.event_type_id'', secondary=Event.__table__, secondaryjoin=''Event.venue_id==Venue.id'')
"secundario" solo espera un objeto Table, no una clase mapeada.
También tenga en cuenta que SQLAlchemy recomienda el patrón de objeto de asociación , en lugar de realizar configuraciones "secundarias" sofisticadas, para mantener este tipo de cosas más claras.
Usé sqlautocode para generar mi modelo y todas las relaciones. Estoy tratando de hacer una consulta simple como
obj = session.query(Venue).filter(Venue.symbol=="CARNEGIE_HALL").one()
Por algún motivo sigo recibiendo este mensaje de error:
File "/usr/lib64/python2.6/site-packages/sqlalchemy/orm/relationships.py", line 331, in _annotate_present_fks
secondarycols = util.column_set(self.secondary.c)
AttributeError: ''Event'' object has no attribute ''c''
Si comento las definiciones de relación, entonces la consulta anterior funciona. Las definiciones de relación generadas por sqlautocode me parecen correctas pero soy nuevo en SqlAlchemy. No estoy seguro de cómo solucionar esto. Intenté cambiar de relación () a relación () pero sigo teniendo el mismo error.
Usando sqlalchemy 0.8.2 y sqlautocode 0.6.
Tenga en cuenta que hay una relación de muchos a uno entre Event y Event_Type y una relación de varios a uno entre Event y Venue.
model.py
DeclarativeBase = declarative_base()
metadata = DeclarativeBase.metadata
metadata.bind = engine
Event = Table(u''Event'', metadata,
Column(u''id'', INTEGER(), primary_key=True, nullable=False),
Column(u''venue_id'', INTEGER(), ForeignKey(''Venue.id''), nullable=False),
Column(u''event_type_id'', INTEGER(), ForeignKey(''Event_Type.id''), nullable=False),
)
Venue = Table(u''Venue'', metadata,
Column(u''id'', INTEGER(), ForeignKey(''Obj.id''), primary_key=True, nullable=False),
Column(u''venue_type_id'', INTEGER(), ForeignKey(''Venue_Type.id''), nullable=False),
Column(u''name'', VARCHAR(length=100), nullable=False),
Column(u''symbol'', VARCHAR(length=50), nullable=False),
)
class Event(DeclarativeBase):
__table__ = Event
#relation definitions
Event_Type = relation(''EventType'', primaryjoin=''Event.event_type_id==EventType.id'')
Venue = relation(''Venue'', primaryjoin=''Event.venue_id==Venue.id'')
class EventType(DeclarativeBase):
__tablename__ = ''Event_Type''
__table_args__ = {}
#column definitions
code = Column(u''code'', VARCHAR(length=50), nullable=False)
description = Column(u''description'', VARCHAR(length=250))
id = Column(u''id'', INTEGER(), primary_key=True, nullable=False)
name = Column(u''name'', VARCHAR(length=100), nullable=False)
#relation definitions
Venues = relation(''Venue'', primaryjoin=''EventType.id==Event.event_type_id'', secondary=Event, secondaryjoin=''Event.venue_id==Venue.id'')
class Venue(DeclarativeBase):
__table__ = Venue
#relation definitions
Event_Types = relation(''EventType'', primaryjoin=''Venue.id==Event.venue_id'', secondary=Event, secondaryjoin=''Event.event_type_id==EventType.id'')
Registro de errores
mod_wsgi (pid=10861): Exception occurred processing WSGI script ''/home/uname/web/html/foo/app/main.py''.
Traceback (most recent call last):
File "/home/uname/web/html/foo/app/main.py", line 208, in application
return callback(environ, start_response)
File "/home/uname/web/html/foo/app/main.py", line 68, in monitor
obj = session.query(Venue).filter(Venue.symbol=="CARNEGIE_HALL").one()
File "/usr/lib64/python2.6/site-packages/sqlalchemy/orm/session.py", line 1106, in query
return self._query_cls(entities, self, **kwargs)
File "/usr/lib64/python2.6/site-packages/sqlalchemy/orm/query.py", line 115, in __init__
self._set_entities(entities)
File "/usr/lib64/python2.6/site-packages/sqlalchemy/orm/query.py", line 124, in _set_entities
self._set_entity_selectables(self._entities)
File "/usr/lib64/python2.6/site-packages/sqlalchemy/orm/query.py", line 157, in _set_entity_selectables
ent.setup_entity(*d[entity])
File "/usr/lib64/python2.6/site-packages/sqlalchemy/orm/query.py", line 2728, in setup_entity
self._with_polymorphic = ext_info.with_polymorphic_mappers
File "/usr/lib64/python2.6/site-packages/sqlalchemy/util/langhelpers.py", line 614, in __get__
obj.__dict__[self.__name__] = result = self.fget(obj)
File "/usr/lib64/python2.6/site-packages/sqlalchemy/orm/mapper.py", line 1426, in _with_polymorphic_mappers
configure_mappers()
File "/usr/lib64/python2.6/site-packages/sqlalchemy/orm/mapper.py", line 2121, in configure_mappers
mapper._post_configure_properties()
File "/usr/lib64/python2.6/site-packages/sqlalchemy/orm/mapper.py", line 1243, in _post_configure_properties
prop.init()
File "/usr/lib64/python2.6/site-packages/sqlalchemy/orm/interfaces.py", line 231, in init
self.do_init()
File "/usr/lib64/python2.6/site-packages/sqlalchemy/orm/properties.py", line 1028, in do_init
self._setup_join_conditions()
File "/usr/lib64/python2.6/site-packages/sqlalchemy/orm/properties.py", line 1102, in _setup_join_conditions
can_be_synced_fn=self._columns_are_mapped
File "/usr/lib64/python2.6/site-packages/sqlalchemy/orm/relationships.py", line 115, in __init__
self._annotate_fks()
File "/usr/lib64/python2.6/site-packages/sqlalchemy/orm/relationships.py", line 311, in _annotate_fks
self._annotate_present_fks()
File "/usr/lib64/python2.6/site-packages/sqlalchemy/orm/relationships.py", line 331, in _annotate_present_fks
secondarycols = util.column_set(self.secondary.c)
AttributeError: ''Event'' object has no attribute ''c''