2013-07-04 57 views
2

我用sqlautocode來生成我的模型和所有的關係。我試圖做這樣SQLAlchemy關係錯誤:對象沒有屬性'c'

obj = session.query(Venue).filter(Venue.symbol=="CARNEGIE_HALL").one() 

一個簡單的查詢,出於某種原因,我不斷收到此錯誤信息:

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的新手。我不知道如何解決這個問題。我嘗試從關係()更改爲關係(),但我仍然得到相同的錯誤。

使用sqlalchemy 0.8.2和sqlautocode 0.6。

請注意Event和Event_Type之間存在多對一關係,Event和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' 

回答

6

你不能這樣說:

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') 

「secondary」只需要一個Table對象,而不是映射的類。

另請注意,SQLAlchemy建議使用association object pattern而不是製作花哨的「輔助」設置,以使這種事情更直接。

+0

使用secondaryjoin,如何訪問輔助表列?例如。我可以通過'event_type = security_obj.Event_Types [0]'獲得Event_Type對象。如何獲得該活動的標題? – ksindi

+1

使用關聯對象模式。 – zzzeek

相關問題