python – SQLAlchemy关系错误:对象没有属性’c’
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – SQLAlchemy关系错误:对象没有属性’c’,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5143字,纯文字阅读大概需要8分钟。
内容图文
![python – SQLAlchemy关系错误:对象没有属性’c’](/upload/InfoBanner/zyjiaocheng/898/7f883abe99cb418092a144cfb3c0a0c0.jpg)
我使用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', 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')
“secondary”只需要一个Table对象,而不是一个映射类.
另请注意,SQLAlchemy建议使用association object pattern,而不是制作花哨的“辅助”设置,以使这种事情更加直接.
内容总结
以上是互联网集市为您收集整理的python – SQLAlchemy关系错误:对象没有属性’c’全部内容,希望文章能够帮你解决python – SQLAlchemy关系错误:对象没有属性’c’所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。