place_collections = Place.query.filter_by(county='BKK')
会给你一个收藏
Place
物体。这类似于
session.query(Place).filter_by(county='BKK')
简单的香草炼金术。
然而,从sqlacalchemy
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 = 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.\u collections.result
是
一
类型
属于
元组
.
如果我们试图将值赋给一个属性,而该属性不是所查询的列之一:
>>> a_result.newattribute = 'something'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'result' object has no attribute 'newattribute'
这条错误消息与我们在将属性分配给plain时得到的消息非常相似。
元组
.
那么,为什么会收到不同的错误消息呢?这个
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.\u collections.result
对象支持对列名称的属性访问,但由于它是
元组
它仍然是不可变的,因此您无法写入这些属性。
要修复您的特定错误(除非您是专门查询那些列的原因),请更改
places
查询对象:
places = db.session.query(Place).outerjoin(Rank, Rank.place_id == Place.place_id)