SQLAlchemy关系错误:对象没有属性"c" [英] SQLAlchemy Relationship Error: object has no attribute 'c'

查看:92
本文介绍了SQLAlchemy关系错误:对象没有属性"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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆