函数和聚合

要在值上应用函数并在数据库端计算聚合,需要注释 QuerySet。

results = await SomeModel.filter(...).annotate(clean_desc=Coalesce("desc", "N/A"))

这将在每个 SomeModel 实例上添加一个名为 clean_desc 的新属性,该属性现在将包含注释的数据。

还可以调用 .values().values_list() 来获取数据,就像常规一样。

函数

函数对字段的每个实例应用转换。

class tortoise.functions.Trim(field, *default_values)[source]

修剪文本边缘的空白。

Trim("字段名称")

tortoise.functions.长度(字段, *默认值)[源代码]

返回文本/blob 的长度。

长度("字段名称")

tortoise.functions.合并(字段, *默认值)[源代码]

如果字段为空,则提供一个默认值。

合并("字段名称", 默认值)

tortoise.functions.小写(字段, *默认值)[源代码]

将文本转换为小写。

小写("字段名称")

tortoise.functions.大写(字段, *默认值)[源代码]

将文本转换为大写。

大写("字段名称")

tortoise.functions.连接(字段, *默认值)[源代码]

连接字段或常量文本。注意,像 sqlite3 这样的数据库不支持 CONCAT

Concat("字段名称", 其他字段名称 常量文本, *args)

tortoise.contrib.mysql.functions.Rand(种子=, 别名=)[源代码]

生成随机数,可选择种子。

Rand()

tortoise.contrib.postgres.functions.Random(别名=)[源代码]

生成随机数。

Random()

tortoise.contrib.sqlite.functions.Random(别名=)[源代码]

生成随机数。

Random()

聚合

聚合应用于整个列,通常与分组一起使用。因此,通常与 .first() QuerySet 结合使用。

tortoise.functions.Count(字段, *默认值, distinct=, _filter=)[源代码]

统计该列的条目数。

Count("字段名称")

tortoise.functions.Sum(field, *default_values, distinct=False, _filter=None)[源代码]

累加该列的所有值。

Sum("字段名称")

tortoise.functions.Max(field, *default_values, distinct=False, _filter=None)[源代码]

返回该列中的最大值。

Max("字段名称")

tortoise.functions.Min(field, *default_values, distinct=False, _filter=None)[源代码]

返回该列中的最小值。

Min("字段名称")

tortoise.functions.Avg(字段, *默认值, distinct=False, _filter=None)[源代码]

返回列中所有值的平均值(均值)。

Avg("字段名称")

基本函数类

tortoise.functions.Function(字段, *默认值)[源代码]

函数/聚合基本信息。

参数:
字段

字段名称

*默认值

函数的额外参数。

database_func pypika.terms.Function

它表示的 pypika 函数。

populate_field_object bool = False

启用 populate_field_object,我们希望尝试保留字段类型。

resolve(model, table)[source]

用于解析 SQL 生成的函数语句。

参数:
model

Model the function is applied on to.

table

pypika.Table to keep track of the virtual SQL table (to allow self referential joins)

返回类型:

dict

返回:

具有键 "joins""fields" 的字典

class tortoise.functions.Aggregate(field, *default_values, distinct=False, _filter=None)[source]

SQL 聚合的基础。

参数:
field

字段名称

*default_values

函数的额外参数。

is_distinct

带区别的聚合标志

自定义函数

您可以定义非内置的自定义函数,例如 TruncMonthJsonExtract 等。

from pypika import CustomFunction
from tortoise.expressions import F, Function

class TruncMonth(Function):
    database_func = CustomFunction("DATE_FORMAT", ["name", "dt_format"])

sql = Task.all().annotate(date=TruncMonth('created_at', '%Y-%m-%d')).values('date').sql()
print(sql)
# SELECT DATE_FORMAT(`created_at`,'%Y-%m-%d') `date` FROM `task`

您还可以在更新中使用函数,该示例仅适用于 MySQL 和 SQLite,但 PostgreSQL 是相同的。

from tortoise.expressions import F
from pypika.terms import Function

class JsonSet(Function):
    def __init__(self, field: F, expression: str, value: Any):
        super().__init__("JSON_SET", field, expression, value)

json = await JSONFields.create(data_default={"a": 1})
json.data_default = JsonSet(F("data_default"), "$.a", 2)
await json.save()

# or use queryset.update()
sql = JSONFields.filter(pk=json.pk).update(data_default=JsonSet(F("data_default"), "$.a", 3)).sql()
print(sql)
# UPDATE jsonfields SET data_default=JSON_SET(`data_default`,'$.a',3) where id=1