python – SQLAlchemy关系错误:对象没有属性’c’
发布时间:2020-12-20 11:28:09 所属栏目:Python 来源:网络整理
导读:我使用 sqlautocode来生成我的模型和所有关系.我正在尝试做一个简单的查询 obj = session.query(Venue).filter(Venue.symbol=="CARNEGIE_HALL").one() 出于某种原因,我不断收到此错误消息: File "/usr/lib64/python2.6/site-packages/sqlalchemy/orm/relati
我使用
sqlautocode来生成我的模型和所有关系.我正在尝试做一个简单的查询
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的新手.我不知道如何解决这个问题.我尝试从relation()更改为relationship()但我仍然得到相同的错误. 使用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',ForeignKey('Venue.id'),Column(u'event_type_id',ForeignKey('Event_Type.id'),) Venue = Table(u'Venue',ForeignKey('Obj.id'),Column(u'venue_type_id',ForeignKey('Venue_Type.id'),Column(u'name',VARCHAR(length=100),Column(u'symbol',VARCHAR(length=50),) 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',nullable=False) description = Column(u'description',VARCHAR(length=250)) id = Column(u'id',nullable=False) name = Column(u'name',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',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",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",in _annotate_present_fks secondarycols = util.column_set(self.secondary.c) AttributeError: 'Event' object has no attribute 'c' 解决方法
你不能这样说:
Venues = relation('Venue',secondaryjoin='Event.venue_id==Venue.id') 你需要这样说: Venues = relation('Venue',secondary=Event.__table__,secondaryjoin='Event.venue_id==Venue.id') “secondary”只需要一个Table对象,而不是一个映射类. 另请注意,SQLAlchemy建议使用association object pattern,而不是制作花哨的“辅助”设置,以使这种事情更加直接. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |