コンテンツにスキップ

集計関数

現在、6種類の集約関数がサポートされています。

  • count(distinct: bool = True) -> int

  • 存在()->ブール値

  • 合計(列)->任意

  • 平均値(列)->任意

  • 分(列)->任意

  • 最大(列)->任意

  • クエリセットエージェント

    • QuerysetProxy.count(distinct=True) 方法
    • QuerysetProxyの存在()メソッド
    • QuerysetProxy. sum(列)メソッド
    • QuerysetProxy. avg(列)メソッド
    • QuerysetProxy. min(column)メソッド
    • QuerysetProxy. max(列)メソッド

数える

count(distinct: bool = True) -> int

指定された条件に一致するローの数を返します(つまり、フィルタが適用され、除外されています)。これにより、指定されたプライマリローの数が返されます(デフォルト値)。 Falseの場合、カウントは返される行の総数になります(1対多または複数対多の左select_atedテーブル接続の余分な行を含む)。Falseは、ワークフローに依存するレガシー(欠陥のある)動作です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
class Book(ormar. Model):
    ormar_config=ormar. OrmarConfig
        データベース=データベース。データベース(DATABASE_URL)、
        metadata=sqlalchemy. MetaData(),
        tablename="book"
    )

    id: int=ormar.Integer(プライマリキー=True)
    title: str=ormar.String(max_length=200)
    著者: str=ormar.String(max_length=100)
    ジャンル: str=ormar.String(
        max_length=100,
        default="Fiction",
        選択肢=["Fiction","Adventure","Historic","Fantasy"],
    )


#Booksモデルのdb内の行のカウントを返します。
no_of_books=Book. object.count()を待つ

存在する

存在()->ブール値

指定された条件を満たすローがあるかどうかを確認するブール値を返します(フィルターと除外とともに適用されます)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
class Book(ormar. Model):
    ormar_config=ormar. OrmarConfig
        データベース=データベース。データベース(DATABASE_URL)、
        metadata=sqlalchemy. MetaData(),
        tablename="book"
    )

    id: int=ormar.Integer(プライマリキー=True)
    title: str=ormar.String(max_length=200)
    著者: str=ormar.String(max_length=100)
    ジャンル: str=ormar.String(
        max_length=100,
        default="Fiction",
        選択肢=["Fiction","Adventure","Historic","Fantasy"],
    )


#指定された行が存在する場合、ブール値を返します。
has_sample=awaitブック。オブジェクト。フィルター(タイトル='サンプル')。存在する()

そして

合計(列)->任意

指定された条件に一致する行の列の合計値を返します(フィルターが適用され、以前に設定された場合は除外されます)。

関連するカラムを含む1つ以上のカラム名を渡すことができます。

これまでのところ、渡された各列は個別に集計されています(したがって、sum(col 1+col 2)は不可能です。sum(col 1、col 2)を使用して、Pythonで2つの返される合計を追加できます)

数値以外の列を合計することはできません。

列を集計する場合は、結果として単一の値を直接返します複数の列を集計する場合は、column:結果ペアを含むディクショナリを返します

与えられたモデルは次のとおりです

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from typing import Optional

import databases
import ormar
import sqlalchemy
from tests.settings import DATABASE_URL

database = databases.Database(DATABASE_URL)
metadata = sqlalchemy.MetaData()


base_ormar_config = ormar.OrmarConfig(
    metadata=metadata,
    database=database,
)


class Author(ormar.Model):
    ormar_config = base_ormar_config.copy(tablename="authors", order_by=["-name"])

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)


class Book(ormar.Model):

    ormar_config = base_ormar_config.copy(
        tablename="books", order_by=["year", "-ranking"]
    )

    id: int = ormar.Integer(primary_key=True)
    author: Optional[Author] = ormar.ForeignKey(Author)
    title: str = ormar.String(max_length=100)
    year: int = ormar.Integer(nullable=True)
    ranking: int = ormar.Integer(nullable=True)

使用例を次に示します

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Author=await Author(name="Author 1"). save()
await Book(title="Book 1", year=1920,ランキング=3,著者=著者).save()
await Book(title="Book 2", year=1930,ランキング=1,著者=著者).save()
await Book(title="Book 3", year=1923,ランキング=5,著者=著者).save()

assert await Book. object.sum("year")==5773
result=await Book. object.sum(["年","ランキング"])
assert result==dict(年=5773,ランキング=9)

トライ:
    #文字列列を合計できません
    await Book. object.sum("title")
ormar.QueryDefinitionErrorを除く:
    パス

assert await著者を待つ。オブジェクト。選択関連("books")。合計("books__year")==5773
result=await著者。オブジェクト。関連する選択("books")。合計(
    ["book__year","book__ランキング"]
)
assert result==dict(book__year=5773, book__ランキング=9)

アサート(
    await著者。オブジェクト。関連する選択("books")
    . filter(book__year__lt=1925)
    . sum("book__year")
    == 3843
)

平均する

平均値(列)->任意

指定された条件に一致する行の列の平均値を返します(フィルターが適用され、以前に設定された場合は除外されます)。

関連するカラムを含む1つ以上のカラム名を渡すことができます。

これまでのところ、渡された各列は個別に集計されています(したがって、sum(col 1+col 2)は不可能です。sum(col 1、col 2)を使用して、Pythonで2つの返される合計を追加できます)

数値以外の列の平均値を求めることはできません。

列を集計する場合は、結果として単一の値を直接返します複数の列を集計する場合は、column:結果ペアを含むディクショナリを返します

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from typing import Optional

import databases
import ormar
import sqlalchemy
from tests.settings import DATABASE_URL

database = databases.Database(DATABASE_URL)
metadata = sqlalchemy.MetaData()


base_ormar_config = ormar.OrmarConfig(
    metadata=metadata,
    database=database,
)


class Author(ormar.Model):
    ormar_config = base_ormar_config.copy(tablename="authors", order_by=["-name"])

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)


class Book(ormar.Model):

    ormar_config = base_ormar_config.copy(
        tablename="books", order_by=["year", "-ranking"]
    )

    id: int = ormar.Integer(primary_key=True)
    author: Optional[Author] = ormar.ForeignKey(Author)
    title: str = ormar.String(max_length=100)
    year: int = ormar.Integer(nullable=True)
    ranking: int = ormar.Integer(nullable=True)

使用例を次に示します

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Author=await Author(name="Author 1"). save()
await Book(title="Book 1", year=1920,ランキング=3,著者=著者).save()
await Book(title="Book 2", year=1930,ランキング=1,著者=著者).save()
await Book(title="Book 3", year=1923,ランキング=5,著者=著者).save()

assert round(float(await Book. object.avg("year")),2)==1924.33
result=await Book. object.avg(["year","ランキング"])
assert round(float(result. get("year")),2)==1924.33
assert result. get("ランキング")==3.0

トライ:
    #文字列列をavgできません
    await Book. object.avg("title")
ormar.QueryDefinitionErrorを除く:
    パス

result=await Author. object.select_関連("books").avg("books__year")
assert round(float(result),2)==1924.33
result=await著者。オブジェクト。関連する選択("books")。avg(
    ["book__year","book__ランキング"]
)
assert round(float(result. get("books__year")),2)==1924.33
assert result. get("book__ランキング")==3.0

アサート(
    await著者。オブジェクト。関連する選択("books")
    . filter(book__year__lt=1925)
    . avg("book__year")
    == 1921.5
)

分

分(列)->任意

指定された条件に一致する行の列の最小値を返します(フィルターで適用され、以前に設定された場合は除外されます)。

関連するカラムを含む1つ以上のカラム名を渡すことができます。

これまでのところ、渡された各列は個別に集計されています(したがって、sum(col 1+col 2)は不可能です。sum(col 1、col 2)を使用して、Pythonで2つの返される合計を追加できます)

列を集計する場合は、結果として単一の値を直接返します複数の列を集計する場合は、column:結果ペアを含むディクショナリを返します

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from typing import Optional

import databases
import ormar
import sqlalchemy
from tests.settings import DATABASE_URL

database = databases.Database(DATABASE_URL)
metadata = sqlalchemy.MetaData()


base_ormar_config = ormar.OrmarConfig(
    metadata=metadata,
    database=database,
)


class Author(ormar.Model):
    ormar_config = base_ormar_config.copy(tablename="authors", order_by=["-name"])

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)


class Book(ormar.Model):

    ormar_config = base_ormar_config.copy(
        tablename="books", order_by=["year", "-ranking"]
    )

    id: int = ormar.Integer(primary_key=True)
    author: Optional[Author] = ormar.ForeignKey(Author)
    title: str = ormar.String(max_length=100)
    year: int = ormar.Integer(nullable=True)
    ranking: int = ormar.Integer(nullable=True)

使用例を次に示します

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Author=await Author(name="Author 1"). save()
await Book(title="Book 1", year=1920,ランキング=3,著者=著者).save()
await Book(title="Book 2", year=1930,ランキング=1,著者=著者).save()
await Book(title="Book 3", year=1923,ランキング=5,著者=著者).save()

assert await Book. object.min("year")==1920
result=await Book. object.min(["年","ランキング"])
assert result==dict(年=1920,ランキング=1)

assert await Book. object.min("title")=="Book 1"

assert await著者を待つ。オブジェクト。選択関連("books")。min("books__year")==1920
result=await著者。オブジェクト。関連する選択("books")。min(
    ["book__year","book__ランキング"]
)
assert result==dict(book__year=1920, book__ランキング=1)

アサート(
    await著者。オブジェクト。関連する選択("books")
    . filter(book__year__gt=1925)
    . min("book__year")
    == 1930
)

最大限度

最大(列)->任意

指定された条件に一致する行の列の最大値を返します(フィルターで適用され、以前に設定された場合は除外されます)。

指定された条件に一致する行の列の最小値を返します(フィルターで適用され、以前に設定された場合は除外されます)。

関連するカラムを含む1つ以上のカラム名を渡すことができます。

これまでのところ、渡された各列は個別に集計されています(したがって、sum(col 1+col 2)は不可能です。sum(col 1、col 2)を使用して、Pythonで2つの返される合計を追加できます)

列を集計する場合は、結果として単一の値を直接返します複数の列を集計する場合は、column:結果ペアを含むディクショナリを返します

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from typing import Optional

import databases
import ormar
import sqlalchemy
from tests.settings import DATABASE_URL

database = databases.Database(DATABASE_URL)
metadata = sqlalchemy.MetaData()


base_ormar_config = ormar.OrmarConfig(
    metadata=metadata,
    database=database,
)


class Author(ormar.Model):
    ormar_config = base_ormar_config.copy(tablename="authors", order_by=["-name"])

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)


class Book(ormar.Model):

    ormar_config = base_ormar_config.copy(
        tablename="books", order_by=["year", "-ranking"]
    )

    id: int = ormar.Integer(primary_key=True)
    author: Optional[Author] = ormar.ForeignKey(Author)
    title: str = ormar.String(max_length=100)
    year: int = ormar.Integer(nullable=True)
    ranking: int = ormar.Integer(nullable=True)

使用例を次に示します

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Author=await Author(name="Author 1"). save()
await Book(title="Book 1", year=1920,ランキング=3,著者=著者).save()
await Book(title="Book 2", year=1930,ランキング=1,著者=著者).save()
await Book(title="Book 3", year=1923,ランキング=5,著者=著者).save()

assert await Book. object.max("year")==1930
result=await Book. object.max(["年","ランキング"])
assert result==dict(年=1930,ランキング=5)

assert await Book. object.max("title")=="Book 3"

assert await著者を待つ。オブジェクト。選択関連("books")。max("books__year")==1930
result=await著者。オブジェクト。関連する選択("books")。max(
    ["book__year","book__ランキング"]
)
assert result==dict(book__year=1930, book__ランキング=5)

アサート(
    await著者。オブジェクト。関連する選択("books")
    . filter(book__year__lt=1925)
    . max("book__year")
    == 1923
)

QuerysetProxyメソッド

関連するManyTomanyフィールドとReverseForeignKeyに直接アクセスする場合は、関連するモデルのリストを返します。

ただし、QuerySet APIのサブセットを公開しているため、親モデルから直接フィルタリング、作成、関連モデルの選択などを行うことができます。

数える

上記のcount関数と全く同じですが、関係の向こう側にある関連オブジェクトからカラムを選択することができます。

!!!ヒントQuerysetProxyの詳細については、querysetproxyセクションにアクセスしてください

存在する

上記のプレゼンス関数と全く同じですが、関係の向こう側にある関連オブジェクトからカラムを選択することができます。

そして

上記のsum関数と全く同じですが、関係の向こう側にある関連オブジェクトの列を合計することができます。

平均する

上記のavg関数と全く同じですが、関係の向こう側にある関連オブジェクトの列を平均化することができます。

分

上記のmin関数と全く同じですが、関係の向こう側にある関連オブジェクトから最小限の列を選択することができます。

最大限度

上記のmax関数と全く同じですが、関係の向こう側にある関連オブジェクトから最大のカラムを選択することができます。

!!!ヒントQuerysetProxyの詳細については、querysetproxyセクションにアクセスしてください