当前位置: 首页 > web >正文

SQLAlchemy 2.x 异步查询方法比较

SQLAlchemy 2.x 异步查询中常用的 结果处理方法速查表,包含方法说明、使用场景、返回类型及典型用途。

SQLAlchemy 查询结果处理方法速查表(适用于 AsyncSession)

方法

说明

返回类型

示例 SQL

示例输出

scalars().all()

获取单列所有值

List[Any]

select(User.id)

[1, 2, 3, 4]

scalars().first()

获取单列的第一行

Any

select(User.email)

"alice@example.com"

scalar()

获取第一行的第一列(聚合)

Any

select(func.count(User.id))

27

mappings().all()

多列,每行为 dict 映射

List[dict]

select(User.id, User.email)

[{'id': 1, 'email': 'a@xx.com'}, {'id': 2, 'email': 'b@xx.com'}]

mappings().first()

返回第一行 dict 映射

dict

select(User.id, User.name)

{'id': 1, 'name': 'Alice'}

first()

返回第一行的 Row

`Row

None`

select(User.id, User.name)

fetchall()

返回所有行 Row 对象列表

List[Row]

select(User.id, User.name)

[(1, 'Alice'), (2, 'Bob')]

fetchone()

返回一行 Row

Row

select(User.id, User.name)

(1, 'Alice')

all()

返回所有 Row(非字典)

List[Row]

select(User.id, User.name)

[(1, 'Alice'), (2, 'Bob')]

one()

获取唯一一行,若多行/无行报错

Row

select(User).where(User.id==1)

User(id=1, name='Alice')

one_or_none()

获取一行或 None

`Row

None`

select(User).where(User.id==9999)

使用建议(按类型):

  • 获取单列(如用户 ID) → 用 scalars().all()
  • 统计总数/最大值 → 用 scalar()
  • 获取结构化多列数据(用于 JSON 返回) → 用 mappings().all()
  • 查找某条记录详情 → 用 mappings().first()one_or_none()
  • 返回原始 SQL 风格 Row → 用 fetchall() / all()(不推荐)

详细解释与建议:

  • scalars()
    • 专门用于查询 单列,如 select(User.id)
    • 会自动去除 Row 封装,只返回具体值
  • mappings()
    • 用于查询 多列,将每一行封装为 dict(字段名:值)
    • 最常用在结构化响应返回中(如 JSON)
  • first()one()
    • first():最多一行,超过无所谓,返回第一行
    • one():必须返回一行,返回多行或无行都抛异常
  • fetchall() / fetchone()
    • 老式用法,返回 Row 对象(类似元组)
    • 不推荐在现代异步代码中使用,建议用 scalars() / mappings() 替代

推荐使用方式总结:

查询类型

推荐方式

单列、多行

scalars().all()

单列、单值

scalar()scalars().first()

多列、多行

mappings().all()

多列、单行

mappings().first()one_or_none()

真实使用示例(异步 FastAPI):

async def test_get_single_column():async with session_factory() as session:query = select(User.id)result = await session.execute(query)user_ids = result.scalars().all()print("用户 ID 列表:", user_ids)  # 用户 ID 列表: [1, 3]# 2. 统计总数/最大值 → 用 scalar()
async def test_aggregate_functions():async with session_factory() as session:# 统计用户总数total_count = await session.execute(select(func.count(User.id)))total = total_count.scalar()print("用户总数:", total)  # 用户总数: 2# 查找最大的角色 IDmax_role_id = await session.execute(select(func.max(User.role_id)))max_role_id_value = max_role_id.scalar()print("最大的角色 ID:", max_role_id_value)  # 最大的角色 ID: 2# 3. 获取结构化多列数据(用于 JSON 返回) → 用 mappings().all()
async def test_get_structured_data():async with session_factory() as session:query = select(User.id, User.user_name, User.email)result = await session.execute(query)users = result.mappings().all()print("结构化多列数据:", users)# 结构化多列数据: [{'id': 1, 'user_name': 'test', 'email': '123@qq.com'},# {'id': 3, 'user_name': 'test1', 'email': '456@qq.com'}]# 4. 查找某条记录详情 → 用 mappings().first() 或 one_or_none()
async def test_find_single_record():async with session_factory() as session:# 使用 mappings().first()query = select(User.id, User.user_name, User.email).where(User.id == 1)result = await session.execute(query)user = result.mappings().first()print("使用 mappings().first() 查找的记录:", user)# 使用 mappings().first() 查找的记录: {'id': 1, 'user_name': 'test', 'email': '123@qq.com'}# 使用 one_or_none()user_obj = await session.execute(select(User).where(User.id == 1))user_result = user_obj.scalars().one_or_none()print("使用 one_or_none() 查找的记录:", user_result)# 使用 one_or_none() 查找的记录: <login_related.model.user.User object at 0x000001477DC206D0># 5. 返回原始 SQL 风格 Row → 用 fetchall() / all()(不推荐)
async def test_get_raw_rows():async with session_factory() as session:query = select(User.id, User.user_name, User.email)result = await session.execute(query)rows = result.all()print("原始 SQL 风格 Row:", rows)# 原始 SQL 风格 Row: [(1, 'test', '123@qq.com'), (3, 'test1', '456@qq.com')]

 

http://www.xdnf.cn/news/2010.html

相关文章:

  • Android 14 修改侧滑手势动画效果
  • xfce桌面汉化设置
  • 【防火墙 pfsense】2配置
  • 豆瓣图书数据采集与可视化分析(三)- 豆瓣图书数据统计分析
  • OSPF网络协议
  • Antd Modal Drawer 更改默认项
  • WSL 安装过程整理
  • 应用在物联网设备的爱普生可编程晶振SG-8018CA
  • Redis是单线程的,如何提高多核CPU的利用率?
  • 大学IP广播系统解决方案:构建数字化智慧化大学校园IP广播平台
  • 【含文档+PPT+源码】基于微信小程序的校园快递平台
  • HTML 模板技术与服务端渲染
  • 京东平台关键字搜索接口开发指南:Python实现与代码详解
  • PicoVR眼镜在XR融合现实显示模式下无法显示粒子问题
  • 大模型扫盲之推理性能指标全面详解
  • linux系统问题杂谈
  • Framework模块编译脚本利器
  • KafkaSpark-Streaming
  • C语言数据类型全面解析:从入门到精通
  • Django【应用 01】django-plotly-dash安装及使用
  • Java 设计模式心法之第22篇 - 备忘录 (Memento) - 捕获与恢复对象状态的“时光机”
  • 力扣-160.相交链表
  • 制作一款打飞机游戏23:编辑器ui
  • kafka与flume的整合、spark-streaming
  • Virtio 技术解析 | 框架、设备实现与实践指南
  • 【分布式系统中的“瑞士军刀”_ Zookeeper】一、Zookeeper 快速入门和核心概念
  • EasyRTC音视频实时通话嵌入式SDK,打造社交娱乐低延迟实时互动的新体验
  • Golang日志模块之xlog
  • 58、微服务保姆教程(一)
  • classfinal 修改过源码,支持jdk17 + spring boot 3.2.8