跳转至

聚合查询

Cherry 支持部分聚合查询。

count

获取查询结果的数量。

    nums = await User.filter(User.age >= 15).count()

avg

获取查询结果指定字段的平均值。

    avg = await User.filter(User.money >= 500).avg(User.money)

min

获取查询结果指定字段的最小值。

    min_age = await User.select().min(User.age)

max

获取查询结果指定字段的最大值。

    max_age = await User.select().max(User.age)

sum

获取查询结果指定字段的总和。

    money_sum = await User.filter(User.age >= 20).sum(User.money)

coalesce

获取查询结果指定字段的合并取值,返回字段列表中的第一个非空值,如都为空,则返回 None

1
2
3
4
5
6
    c: Union[str, int, None] = (
        await User.select().coalesce(User.name, User.money).first()
    )
    cs: list[Union[str, int, None]] = (
        await User.select().coalesce(User.name, User.money).all()
    )

完整代码

本章完整示例代码
from typing import Union

import cherry

db = cherry.Database("sqlite+aiosqlite:///:memory:")


class User(cherry.Model):
    id: int = cherry.Field(primary_key=True)
    name: str = cherry.Field(unique=True)
    age: int
    money: int

    cherry_config = cherry.CherryConfig(tablename="user", database=db)


async def main():
    await db.init()

    users = [
        User(id=i, name=f"user {i}", age=i * 5, money=i * 100) for i in range(1, 11)
    ]
    await User.save_many(*users)

    nums = await User.filter(User.age >= 15).count()
    avg = await User.filter(User.money >= 500).avg(User.money)
    min_age = await User.select().min(User.age)
    max_age = await User.select().max(User.age)
    money_sum = await User.filter(User.age >= 20).sum(User.money)
    c: Union[str, int, None] = (
        await User.select().coalesce(User.name, User.money).first()
    )
    cs: list[Union[str, int, None]] = (
        await User.select().coalesce(User.name, User.money).all()
    )


if __name__ == "__main__":
    import asyncio

    asyncio.run(main())