Python SQLAlchemy关系错误:对象没有属性';c';

Python SQLAlchemy关系错误:对象没有属性';c';,python,orm,sqlalchemy,python-2.6,Python,Orm,Sqlalchemy,Python 2.6,我曾经生成过我的模型和所有的关系。我试着做一个简单的查询,比如 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 second

我曾经生成过我的模型和所有的关系。我试着做一个简单的查询,比如

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还不熟悉。我不知道如何解决这个问题。我尝试从relationship()更改为relationship(),但仍然出现相同的错误

使用sqlalchemy 0.8.2和sqlautocode 0.6

注意:事件和事件类型之间存在多对一关系,事件和场地之间存在多对一关系

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')
你需要这样说:

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”只需要一个表对象,不需要映射类


还要注意的是,SQLAlchemy建议使用,而不是进行花哨的“辅助”设置,以使这类设置更简单。

使用secondaryjoin,如何访问辅助表列?例如,我可以通过
Event\u Type=security\u obj.Event\u Types[0]
获取Event\u Type对象。如何获取事件的标题?使用关联对象模式。