place_collections = Place.query.filter_by(county='BKK')
将返回您的Place
对象集合。这类似于session.query(Place).filter_by(county='BKK')
普通的香草sqlAlchemy。
该查询还接受ORM插入的描述符作为参数。每当将多个类实体或基于列的实体表示为query()函数的参数时,返回结果均表示为元组
关键点是,当您指定要查询的特定列时,就像在此处所做的那样:
places = db.session.query(Place.roll_number, Place.name,
Place.website, Place.address, Place.distance).\
outerjoin(Rank, Rank.place_id == Place.place_id)
结果表示为的集合tuples
。
我的第一印象是can't set attribute
从尝试向分配属性值时收到一条奇怪的错误消息tuple
,所以我尝试了一下:
>>> t = tuple()
>>> t.attribute = 9
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'attribute'
那不是您收到的错误消息。
因此,我执行了与您的第二个查询类似的查询(该模型只是我打开的项目中的内容):
>>> q = session.query(Racecard.id, Racecard.meeting)
>>> a_result = q[0]
>>> type(a_result)
<class 'sqlalchemy.util._collections.result'>
是的,所以我们没有一个元组,而是一个sqlalchemy.util._collections.result
对象。但..
>>> issubclass(type(a_result), tuple)
True
所以,sqlalchemy.util._collections.result
是 一个 类型 的tuple
。
>>> a_result.newattribute = 'something'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'result' object has no attribute 'newattribute'
该错误消息与将属性分配给Plain时获得的错误消息非常相似tuple
。
那么,为什么会收到其他错误消息?该result
对象实际上更像是namedtuple
:
>>> from collections import namedtuple
>>> Racecard = namedtuple('Racecard', 'id, meeting')
>>> rc = Racecard(1, 'Doomben')
>>> rc.meeting = 'Eagle Farm'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: can't set attribute
这与您收到的错误消息相同。
因此,该sqlalchemy.util._collections.result
对象支持对列名称的属性访问,但由于它tuple
仍然是不可变的,因此您无法写入这些属性。
为了解决您的特定错误(除非出于某些原因,您仅专门查询那些列)将places
查询更改为:
places = db.session.query(Place).outerjoin(Rank, Rank.place_id == Place.place_id)