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
相关产品推荐
相关产品推荐

