place_collections =Place.query.filter_by(county='BKK')将返回您的
Place对象集合。这类似于
session.query(Place).filter_by(county='BKK')普通的香草SQLAlchemy。
但是,从SQLAlchemy
docs:
该查询还接受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 = 9Traceback (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)



