聚合查询
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
。
| 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())
|