SQLAlchemy关系错误:对象没有属性"c" [英] SQLAlchemy Relationship Error: object has no attribute 'c'
问题描述
我使用 sqlautocode 生成了我的模型和所有关系.我正在尝试做一个简单的查询
I used sqlautocode to generate my model and all the relationships. I'm trying to do a simple query like
obj = session.query(Venue).filter(Venue.symbol=="CARNEGIE_HALL").one()
出于某种原因,我不断收到此错误消息:
For some reason I keep getting this error message:
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'
如果我注释掉关系定义,则上面的查询有效. sqlautocode生成的关系定义对我来说似乎很正确,但是我对SqlAlchemy还是陌生的.我不确定如何解决此问题.我尝试从lationship()更改为relationship(),但仍然遇到相同的错误.
If I comment out the relationship definitions, then the query above works. The relationship definitions generated by sqlautocode look right to me but I'm new to SqlAlchemy. I'm not sure how to fix this. I tried changing from relation() to relationship() but I still get the same error.
使用sqlalchemy 0.8.2和sqlautocode 0.6.
Using sqlalchemy 0.8.2 and sqlautocode 0.6.
请注意,Event和Event_Type之间存在多对一关系,Event和Venue之间存在多对一关系.
Note there's a many-to-one relation between Event and Event_Type and a many-to-one between Event and 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')
错误日志
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'
推荐答案
您不能这样说:
Venues = relation('Venue', primaryjoin='EventType.id==Event.event_type_id', secondary=Event, secondaryjoin='Event.venue_id==Venue.id')
您需要这样说:
Venues = relation('Venue', primaryjoin='EventType.id==Event.event_type_id', secondary=Event.__table__, secondaryjoin='Event.venue_id==Venue.id')
第二"仅需要一个Table对象,而不是映射的类.
"secondary" expects only a Table object, not a mapped class.
还要注意,SQLAlchemy建议使用关联对象模式,而不是进行精美的辅助"设置,而是使此类操作更简单.
Also note that SQLAlchemy recommends the association object pattern, rather than making fancy "secondary" setups, to keep this kind of thing more straightforward.
这篇关于SQLAlchemy关系错误:对象没有属性"c"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!