如何在Tortoise ORM中高效使用聚合函数?
高效实现ORM中的实体计数与最大ID查询
一、实体计数优化
你之前用的(await Users.all()).count()会先拉取所有实体数据再计算长度,确实效率低下。正确的做法是直接让数据库执行聚合计数,避免全表数据加载:
原生ORM聚合查询(以SQLAlchemy异步为例)
from sqlalchemy import func # 通过会话执行count聚合 count = await session.scalar(func.count(Users.id))
封装成简洁的类方法
如果想要类似await Users.count()的调用方式,可以给模型类添加类方法:
class Users(Base): __tablename__ = "users" id = Column(Integer, primary_key=True) # 其他字段定义... @classmethod async def count(cls, session): return await session.scalar(func.count(cls.id))
调用时只需:
count = await Users.count(session)
二、获取最大ID优化
你之前的annotate+values_list写法过于繁琐,同样可以通过数据库层面的max聚合查询简化:
原生ORM聚合查询(以SQLAlchemy异步为例)
max_id = await session.scalar(func.max(Users.id))
封装成简洁的类方法
同样封装成模型类的类方法,实现await Users.max('id')风格的调用:
class Users(Base): # ... 已有模型定义 ... @classmethod async def max(cls, session, field): return await session.scalar(func.max(getattr(cls, field)))
调用时:
max_id = await Users.max(session, 'id')
这些方法都直接在数据库端执行聚合操作,不会加载全表数据,既高效又简洁,无需绕过ORM使用原生查询。
内容的提问来源于stack exchange,提问作者Mike Artemiev
相关产品推荐
相关产品推荐

