您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

无法在SQLAlchemy烧瓶中的结果对象上设置属性

无法在SQLAlchemy烧瓶中的结果对象上设置属性

place_collections = Place.query.filter_by(county='BKK')将返回您的Place对象集合。这类似于session.query(Place).filter_by(county='BKK')普通的香草sqlAlchemy。

但是,从sqlAlchemydocs

查询还接受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)
SQLServer 2022/1/1 18:32:28 有493人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶