You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLAlchemy异步查询指定列仅返回首列,如何正确获取多列?

解决SQLAlchemy异步查询多列仅返回第一列的问题

当你查询多个指定列时,scalars().all()只会提取结果集中的第一列数据,这是它的设计特性——专门用于处理单列标量结果。要获取多列数据,你可以用以下几种方式:


方法1:直接获取元组列表

使用result.all()直接返回包含所有列数据的元组列表:

result = await db.execute(select(Soldier.id, Soldier.name, Soldier.service_number))
soldiers = result.all()
# 结果示例:[(uuid1, "张三", 1001), (uuid2, "李四", 1002)]

方法2:获取具名元组(更易读)

用result.named_tuple().all()返回具名元组,支持通过列名访问数据:

result = await db.execute(select(Soldier.id, Soldier.name, Soldier.service_number))
soldiers = result.named_tuple().all()
# 访问示例:soldiers[0].id, soldiers[0].name

方法3:获取字典列表

用result.mappings().all()返回字典列表,键为列名,值为对应数据:

result = await db.execute(select(Soldier.id, Soldier.name, Soldier.service_number))
soldiers = result.mappings().all()
# 结果示例:[{"id": uuid1, "name": "张三", "service_number": 1001}, ...]

方法4:加载指定列到Soldier实例(ORM方式)

如果你希望返回模型实例,但只加载指定列,可以结合load_only选项:

from sqlalchemy.orm import load_only

result = await db.execute(select(Soldier).options(load_only(Soldier.id, Soldier.name, Soldier.service_number)))
soldiers = result.scalars().all()
# 此时每个Soldier实例仅加载了指定列,其他列会是默认值或None

注意:这些方法和你使用的PlanetScale(Vitess)数据库无关,是SQLAlchemy的通用用法,不同方法适用于不同的业务场景,按需选择即可。

内容的提问来源于stack exchange,提问作者Lee Skies

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 17:12:37