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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 06:13:21