コンテンツにスキップ

モデル

モデルの定義

ormarモデルを定義することで、対応するPydanticモデルとSqlalchemyテーブルを無料で入手できます。それらはバックグラウンドで管理され、自分で作成する必要はありません。

モデルクラス

ormarモデルを構築するには、ormar. Modelクラスを継承するだけです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import databases
import ormar
import sqlalchemy

database = databases.Database("sqlite:///db.sqlite")
metadata = sqlalchemy.MetaData()


class Course(ormar.Model):
    ormar_config = ormar.OrmarConfig(
        database=database,
        metadata=metadata,
    )

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)
    completed: bool = ormar.Boolean(default=False)

フィールドの定義

次に、1つ以上のフィールドをクラスレベル変数として割り当てます。

基本フィールドタイプ

各テーブルにはプライマリキーカラムが必要です。プライマリキーカラムを指定するには、選択したフィールドに[Prime_key=True]を設定します。

プライマリキーカラムは1つだけ許可されます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import databases
import ormar
import sqlalchemy

database = databases.Database("sqlite:///db.sqlite")
metadata = sqlalchemy.MetaData()


class Course(ormar.Model):
    ormar_config = ormar.OrmarConfig(
        database=database,
        metadata=metadata,
    )

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)
    completed: bool = ormar.Boolean(default=False)

!!!警告Prime_keyカラムを割り当てないか、モデルごとに複数のカラムを割り当てると、ModelDefinitionError例外が発生します。

デフォルトでは、プライマリキーが整数フィールドに割り当てられている場合、自動増分オプションはtrueに設定されます。

自動増分=Falseを渡すことで無効にすることができます。

1
id: int=ormar.Integer(プライマリキー=True、オートインクリメント=False)

データベース以外のフィールド

モデルに通常のpydanticフィールド(モデルに値を格納したり、特定の値を渡したりするため)が必要な場合は、通常どおりpydanticでフィールドを定義できることに注意してください。

このように作成されたフィールドはpydanticモデルフィールドに追加されます->したがって、フィールドタイプに応じて検証され、model_dump()とmodel_dump_json()の結果にも表示されます。

違いは、これらのフィールドがデータベースに保持されないことです。したがって、それらは基礎となるsqlalchemyカラムまたはテーブル変数に含まれません(必要に応じてこれらにアクセスする方法については、以下の内部セクションを確認してください)。

その後、pydanticフィールドは移行や保存、更新などのデータベース操作には含まれません。

このようなフィールドは、fastapiリクエストのペイロードに渡され、fastapiレスポンスで返されます(もちろん、値はデータベースから取得されないため、コードのどこかに値を設定した場合に限ります)。 fastapirequestで値を渡し、request_modelでfastapiが作成したものと同じインスタンスを返す場合は、応答でまったく同じ値を返す必要があります。)。

!!! 警告pydanticフィールドは常にオプションである必要があり、変更することはできません(そうしないと、データベースのロード検証が失敗します)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import databases
import ormar
import pydantic
import sqlalchemy

database = databases.Database("sqlite:///db.sqlite")
metadata = sqlalchemy.MetaData()


class Course(ormar.Model):
    ormar_config = ormar.OrmarConfig(
        database=database,
        metadata=metadata,
    )

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)
    completed: bool = ormar.Boolean(default=False)
    non_db_field: str = pydantic.Field(max_length=100)

pydanticフィールドをデフォルト引数で設定し、実際の値をリクエストに渡さないと、常にデフォルト値が取得されます。関数でもいいのでdefault=datetime.datetime.nowを設定し、エンドポイントなどを呼び出すたびに現在のタイムスタンプを取得できます。

Fastapiの非データベースフィールド

pydantic修飾子フィールドと計算された_field修飾子フィールドの両方が、model_dump()およびfastapiレスポンスに含める/除外することができ、それに応じて、response_model_include/response_model_cludeを含める/除外することができることに注意してください。

 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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#<==関連するコードの一部を明確にするために削除==>
base_ormar_config=ormar. OrmarConfig(ベースの設定
    データベース=データベース。データベース(DATABASE_URL)、
    metadata=sqlalchemy. MetaData(),
    engine=sqlalchemy. create_engine(DATABASE_URL),
)


class User(ormar. Model):
    or_config=base_or_config. copy(tablename="user 2")

    id: int=ormar.Integer(プライマリキー=True)
    email: str=ormar.String(max_length=255,nullable=False)
    パスワード: str=ormar.String(max_length=255)
    first_name: str=ormar.String(max_length=255)
    last_name: str=ormar.String(max_length=255)
    カテゴリ: str=ormar.String(max_length=255,nullable=True)
    タイムスタンプ: date time.date time=pydantic.Field(
        デフォルト=datetime.datetime.now
    )

#<==関連するコードの一部を明確にするために削除==>
app=Fast API()

@app.post("/users/")
async def create_user(user: User):
    return awaituser.save()

#<==関連するコードの一部を明確にするために削除==>

def test_cluding_field_in_endpoints():
    client=TestClient(アプリ)
    クライアントをクライアントとして:
        タイムスタンプ=datetime.datetime.now()

        ユーザー={
            "email":"test@domain.com",
            "パスワード":"^*^%A*DA*IA AA",
            "first_name":"ジョン",
            "last_name":"Doe",
            "timestamp": str(タイムスタンプ),
        }
        response=client.post("/users/", json=user)
        assertリスト(response. json().keys())==[
            "id",
            "メール",
            "first_name",
            "last_name",
            "カテゴリー",
            "タイムスタンプ",
        ]
        #返されるのは同じタイムスタンプ
        assert response. json().get("timestamp")==str(timestamp).replace("","T")


#<==関連するコードの一部を明確にするために削除==>

フィールド名とカラム名

デフォルトでは、フィールド名は基盤となるpydanticモデルとsqlalchemyテーブルに使用されます。

何らかの理由でデータベースの名前を変更したいが、モデル内で名前を保持したい場合は、フィールド宣言中に名前パラメーターを指定してこれを行うことができます

ここでは、名前が変更されたサンプルモデルです

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import databases
import ormar
import sqlalchemy

DATABASE_URl = "sqlite:///test.db"

database = databases.Database(DATABASE_URl, force_rollback=True)
metadata = sqlalchemy.MetaData()


class Child(ormar.Model):
    ormar_config = ormar.OrmarConfig(
        database=database,
        metadata=metadata,
        tablename="children",
    )

    id: int = ormar.Integer(name="child_id", primary_key=True)
    first_name: str = ormar.String(name="fname", max_length=100)
    last_name: str = ormar.String(name="lname", max_length=100)
    born_year: int = ormar.Integer(name="year_born", 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
31
32
33
34
from typing import Optional

import databases
import ormar
import sqlalchemy

database = databases.Database("sqlite:///test.db", force_rollback=True)
metadata = sqlalchemy.MetaData()


class Artist(ormar.Model):
    ormar_config = ormar.OrmarConfig(
        database=database,
        metadata=metadata,
        tablename="artists",
    )

    id: int = ormar.Integer(name="artist_id", primary_key=True)
    first_name: str = ormar.String(name="fname", max_length=100)
    last_name: str = ormar.String(name="lname", max_length=100)
    born_year: int = ormar.Integer(name="year")


class Album(ormar.Model):

    ormar_config = ormar.OrmarConfig(
        database=database,
        metadata=metadata,
        tablename="music_albums",
    )

    id: int = ormar.Integer(name="album_id", primary_key=True)
    name: str = ormar.String(name="album_name", max_length=100)
    artist: Optional[Artist] = ormar.ForeignKey(Artist, name="artist_id")

ただし、現時点では、とにかく他のモデルを通過するため、ManyTomanyカラム名を変更することはできません。

 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
36
37
38
39
40
41
42
43
import databases
import ormar
import sqlalchemy

DATABASE_URl = "sqlite:///test.db"

database = databases.Database(DATABASE_URl, force_rollback=True)
metadata = sqlalchemy.MetaData()


class Child(ormar.Model):
    ormar_config = ormar.OrmarConfig(
        database=database,
        metadata=metadata,
        tablename="children",
    )

    id: int = ormar.Integer(name="child_id", primary_key=True)
    first_name: str = ormar.String(name="fname", max_length=100)
    last_name: str = ormar.String(name="lname", max_length=100)
    born_year: int = ormar.Integer(name="year_born", nullable=True)


class ArtistChildren(ormar.Model):
    ormar_config = ormar.OrmarConfig(
        database=database,
        metadata=metadata,
        tablename="children_x_artists",
    )


class Artist(ormar.Model):
    ormar_config = ormar.OrmarConfig(
        database=database,
        metadata=metadata,
        tablename="artists",
    )

    id: int = ormar.Integer(name="artist_id", primary_key=True)
    first_name: str = ormar.String(name="fname", max_length=100)
    last_name: str = ormar.String(name="lname", max_length=100)
    born_year: int = ormar.Integer(name="year")
    children = ormar.ManyToMany(Child, through=ArtistChildren)

デフォルトのクエリセットを上書きします

ormarが実行するクエリをカスタマイズしたい場合は、モデルクラスで独自のクエリセットクラス(ormar QuerySetを拡張)を定義できます。デフォルトはQuerySetです

クラスのormar_configで、queryset_classパラメータとして新しいクラスを提供できます。

 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
インポートまたは
from ormar. queryset.querysetインポートQuerySet
from fastapi import HTTPException


class MyQuerySetClass(QuerySet):

    async def first_or_404(self,*args,**kwargs):
        エンティティ=await self. get_or_none(*args,**kwargs)
        エンティティがNoneの場合:
            #fastapiまたはstarletteで
            HTTPExceptionを上げる(404)


class Book(ormar. Model):
    base_ormer_config. copyを使用します。
        Query set_class=MyQuerySetClass,
        tablename="book",
    )

    id: int=ormar.Integer(プライマリキー=True)
    name: str=ormar.String(max_length=32)


本が見つからない場合、あなたのビューで `404` を上げてください。
book=await Book. object.first_or_404(name="123")

タイプヒント

より良いIDEサポートとmypyチェックのために、タイプヒントを提供できることに注意してください。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import databases
import ormar
import sqlalchemy

database = databases.Database("sqlite:///db.sqlite")
metadata = sqlalchemy.MetaData()


class Course(ormar.Model):
    ormar_config = ormar.OrmarConfig(
        database=database,
        metadata=metadata,
    )

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)
    completed: bool = ormar.Boolean(default=False)

型ヒントはオプションであるため、完全に有効なormarコードは次のようになります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import databases
import ormar
import sqlalchemy

database = databases.Database("sqlite:///db.sqlite")
metadata = sqlalchemy.MetaData()


class Course(ormar.Model):
    ormar_config = ormar.OrmarConfig(
        database=database,
        metadata=metadata,
    )

    id = ormar.Integer(primary_key=True)
    name = ormar.String(max_length=100)
    completed = ormar.Boolean(default=False)

!!!警告型ヒントを使用しても、ormarはそれらを使用してpydanticフィールドを構築しません!

1
2
タイプヒントは、静的チェッカーとリンティングをサポートするためだけにあります。
`ormar` は、`pydantic` が自身のフィールドから使用するアノテーションを構築します。

依存関係

ormarはデータベース接続とテーブル作成をデータベースとsqlalchemy-coreに依存しているため、モデルごとに2つの特別なパラメーターを割り当てる必要があります。

データベース

1つは、sqlalchemy接続文字列形式のデータベースURLを使用して作成されたデータベースインスタンスです。

作成されたインスタンスは、ormar_configオブジェクトデータベースパラメータを使用して各モデルに渡す必要があります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import databases
import ormar
import sqlalchemy

database = databases.Database("sqlite:///db.sqlite")
metadata = sqlalchemy.MetaData()


class Course(ormar.Model):
    ormar_config = ormar.OrmarConfig(
        database=database,
        metadata=metadata,
    )

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)
    completed: bool = ormar.Boolean(default=False)

!!!ヒントデータベースインスタンスを一度作成して、それをすべてのモデルで使用するだけです。複数のデータベースを使用する場合は、複数のデータベースを作成できます。

錬金術

2番目の依存関係はsqlalchemy MetaDataインスタンスです。

作成されたインスタンスは、ormar_configオブジェクトのメタデータパラメータを使用して各モデルに渡す必要があります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import databases
import ormar
import sqlalchemy

database = databases.Database("sqlite:///db.sqlite")
metadata = sqlalchemy.MetaData()


class Course(ormar.Model):
    ormar_config = ormar.OrmarConfig(
        database=database,
        metadata=metadata,
    )

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)
    completed: bool = ormar.Boolean(default=False)

!!!ヒントMetaDataインスタンスを一度だけ作成し、それをすべてのモデルで使用するだけです。複数のデータベースを使用する場合は、複数のデータベースを作成できます。

ベストプラクティス

ormarには、OrmarConfigクラスのインスタンスであるormar_configという名前のフィールドが必要であることに注意してください。構成管理を簡素化するために、OrmarConfigクラスはレプリケーションメソッドを提供します。 したがって、すべてのモデルに同じパラメーターを何度も提供するのではなく、基本オブジェクトを作成し、そのコピーをすべてのモデルで使用する必要があります。

 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
from typing import Optional

import databases
import ormar
import sqlalchemy

DATABASE_URL = "sqlite:///test.db"

ormar_base_config = ormar.OrmarConfig(
    database=databases.Database(DATABASE_URL),
    metadata=sqlalchemy.MetaData(),
)


class Artist(ormar.Model):
    # note that tablename is optional
    # if not provided ormar will user class.__name__.lower()+'s'
    # -> artists in this example
    ormar_config = ormar_base_config.copy()

    id: int = ormar.Integer(primary_key=True)
    first_name: str = ormar.String(max_length=100)
    last_name: str = ormar.String(max_length=100)
    born_year: int = ormar.Integer(name="year")


class Album(ormar.Model):
    ormar_config = ormar_base_config.copy()

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)
    artist: Optional[Artist] = ormar.ForeignKey(Artist)

テーブル名

デフォルトでは、テーブル名はモデルクラス名に基づいて作成されます。

ormar_configオブジェクトのテーブル名パラメータを指定することで、このパラメータを上書きできます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import databases
import ormar
import sqlalchemy

database = databases.Database("sqlite:///db.sqlite")
metadata = sqlalchemy.MetaData()


class Course(ormar.Model):

    ormar_config = ormar.OrmarConfig(
        database=database,
        metadata=metadata,
        # if you omit this parameter it will be created automatically
        # as class.__name__.lower()+'s' -> "courses" in this example
        tablename="my_courses",
    )

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)
    completed: bool = ormar.Boolean(default=False)

制約条件

モデルレベルでは、SQLカラムにモデルの制約を設定することもできます。

現在、IndexColumns、UniqueColumns、CheckColumns制約のみがサポートされています。

!!!noteこれら2つの制約は、制約に名前を設定する場合、または複数の列にインデックスを設定する場合にのみ使用する必要があることに注意してください。

!!!tipプライマリキー、ユニークキー、外部キーなどのカラム制約の詳細については、フィールドにアクセスしてください。

ユニークなコラム

ormar_configオブジェクト制約パラメータを指定することで、このパラメータを設定できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import databases
import ormar
import sqlalchemy

database = databases.Database("sqlite:///db.sqlite")
metadata = sqlalchemy.MetaData()


class Course(ormar.Model):
    ormar_config = ormar.OrmarConfig(
        database=database,
        metadata=metadata,
        # define your constraints in OrmarConfig of the model
        # it's a list that can contain multiple constraints
        # hera a combination of name and column will have to be unique in db
        constraints=[ormar.UniqueColumns("name", "completed")],
    )

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)
    completed: bool = ormar.Boolean(default=False)

!!!note制約は一意であるべき列の組み合わせであることに注意してください。1つの列を一意に設定するには、一意の共通パラメータを使用します。もちろん、このパラメータを使用して多くの列を一意に設定できますが、各列は個別にチェックされます。

インデックス列

ormar_configオブジェクト制約パラメータを指定することで、このパラメータを設定できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import databases
import ormar
import sqlalchemy

database = databases.Database("sqlite:///db.sqlite")
metadata = sqlalchemy.MetaData()


class Course(ormar.Model):
    ormar_config = ormar.OrmarConfig(
        database=database,
        metadata=metadata,
        # define your constraints in OrmarConfig of the model
        # it's a list that can contain multiple constraints
        # hera a combination of name and column will have a compound index in the db
        constraints=[ormar.IndexColumns("name", "completed")],
    )

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)
    completed: bool = ormar.Boolean(default=False)

!!!note制約は、インデックスに含めるべきカラムの組み合わせであることに注意してください。カラムインデックスを設定するには、一意の共通パラメータを使用します。もちろん、このパラメータを使用して多くのカラムをインデックスとして設定できますが、各カラムは個別のインデックスになります。

列をチェック

ormar_configオブジェクト制約パラメータを指定することで、このパラメータを設定できます。

 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
import datetime

import databases
import ormar
import sqlalchemy

database = databases.Database("sqlite:///db.sqlite")
metadata = sqlalchemy.MetaData()


class Course(ormar.Model):
    ormar_config = ormar.OrmarConfig(
        database=database,
        metadata=metadata,
        # define your constraints in OrmarConfig of the model
        # it's a list that can contain multiple constraints
        # hera a combination of name and column will have a level check in the db
        constraints=[
            ormar.CheckColumns("start_time < end_time", name="date_check"),
        ],
    )

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)
    start_date: datetime.date = ormar.Date()
    end_date: datetime.date = ormar.Date()

!!!Note一部のデータベースでは、チェック制約(My SQLなど)がアクティブにサポートされていないことに注意してください。

カンチレバー構造

各ormar. Modelもpydanticモデルであるため、pydantic構成の設定を調整する必要がある場合があります。

pydanticでこれを行う方法は、モデルに提供されているmodel_configディクショナリの設定を調整することです。これは、ormarモデルとまったく同じように機能します。

したがって、独自の環境設定を設定するには、モデルにormar_configクラスだけでなく、model_config=ConfigDict()クラスも提供する必要があります。

!!!使用可能な設定の詳細については、pydantic設定ページをご覧ください。

独自の設定を提供しない場合、ormarがそれを実行することに注意してください。提供されるデフォルトの設定は次のとおりです。

1
model_config=ConfigDict(検証_割り当て=True, ser_json_bytes="base 64")

したがって、設定を上書きするか、次のように独自のサンプルモデルを提供します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import databases
import ormar
import pydantic
import sqlalchemy

database = databases.Database("sqlite:///db.sqlite")
metadata = sqlalchemy.MetaData()


class Course(ormar.Model):
    ormar_config = ormar.OrmarConfig(
        database=database,
        metadata=metadata,
    )

    model_config = pydantic.ConfigDict(frozen=True)

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)
    completed: bool = ormar.Boolean(default=False)

モデルの追加フィールド

デフォルトでは、ormarはモデルに追加のフィールドを渡すことを禁止しています。

これを行おうとすると、ModelErrorが発生します。

追加のフィールドはデータベースに保存できないため、デフォルトでそのようなフィールドを無効にすることが実行可能なオプションのようです。

代わりに、pydanticでは、デフォルトのオプションはそのような余分なフィールドを無視することであるため、ormarは同じように実行するためのormar_config. extra設定を提供します。

ormarに渡された追加のフィールドを無視するには、この設定をデフォルトのExtra. forbitではなくExtra.noneに設定します。

ormarは追加のフィールドを受け入れることを許可していないことに注意してください

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from ormar import Extra, OrmarConfig

class Child(ormar. Model):
    OrmarConfig(オーマコンフィグ)
        tablename="children",
        #余分なフィールドの存在に対する例外を防ぐために余分な設定を設定する
    )

    id: int=ormar.Integer(name="child_id",プライマリキー=True)
    first_name: str=ormar.String(name="fname",max_length=100)
    last_name: str=ormar.String(name="lname",max_length=100)

すべてのモデルで同じ設定を行うには、ベストプラクティスとbase_ormar_configの概念を確認してください。

モデルのソート

デフォルトでは、指定されたモデルを使用してデータベースにクエリを実行する場合、モデルはPrime_keyカラムの昇順でソートされます。デフォルトの動作を変更するには、モデルまたはmar_configオブジェクトにorder_byパラメータを指定します。

デフォルトのソート例(指定なし-したがってプライマリキーで指定):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
base_ormar_config=ormar. OrmarConfig(ベースの設定
    データベース=データベース。データベース(DATABASE_URL)、
    metadata=sqlalchemy. MetaData(),
)


#デフォルトでは、列IDの昇順で並べ替えます。
class Author(ormar. Model):
    base_ormer_config. copyを使用します。
        tablename="著者",
    )

    id: int=ormar.Integer(プライマリキー=True)
    name: str=ormar.String(max_length=100)

修正された

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
base_ormar_config=ormar. OrmarConfig(ベースの設定
    データベース=データベース。データベース(DATABASE_URL)、
    metadata=sqlalchemy. MetaData(),
)

#現在、デフォルトで名前の降順で並べ替えています。
class Author(ormar. Model):
    base_ormer_config. copyを使用します。
        order_by=["-name"],
        tablename="著者",
    )

    id: int=ormar.Integer(プライマリキー=True)
    name: str=ormar.String(max_length=100)

モデルの初期化

モデルインスタンスを作成してデータベースに保存する方法は2つあります。

後でプログラムを実行するときにインスタンスを変更する予定がある場合は、モデルを通常のクラスとして起動し、save()呼び出しを待つことができます。

 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
import asyncio

import databases
import ormar
import sqlalchemy
from examples import create_drop_database

DATABASE_URL = "sqlite:///test.db"

ormar_base_config = ormar.OrmarConfig(
    database=databases.Database(DATABASE_URL), metadata=sqlalchemy.MetaData()
)


class Course(ormar.Model):
    ormar_config = ormar_base_config.copy(tablename="courses")

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)
    completed: bool = ormar.Boolean(default=False)


@create_drop_database(base_config=ormar_base_config)
async def run_query():
    course = Course(name="Painting for dummies", completed=False)
    await course.save()

    await Course.objects.create(name="Painting for dummies", completed=False)


asyncio.run(run_query())

モデルを起動し、同時にデータベースに保存する場合は、QuerySetのメソッドcreate()を使用します。

一度に複数のオブジェクトを作成するには、bulk_create()QuerySetのメソッドを使用します。

各モデルには、オブジェクトパラメータとして初期化されたクエリセットがあります

 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
import asyncio

import databases
import ormar
import sqlalchemy
from examples import create_drop_database

DATABASE_URL = "sqlite:///test.db"

ormar_base_config = ormar.OrmarConfig(
    database=databases.Database(DATABASE_URL), metadata=sqlalchemy.MetaData()
)


class Course(ormar.Model):
    ormar_config = ormar_base_config.copy(tablename="courses")

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)
    completed: bool = ormar.Boolean(default=False)


@create_drop_database(base_config=ormar_base_config)
async def run_query():
    course = Course(name="Painting for dummies", completed=False)
    await course.save()

    await Course.objects.create(name="Painting for dummies", completed=False)


asyncio.run(run_query())

!!!infoクエリセット(バッチ操作を含む)と使用可能なメソッドの詳細については、クエリをご覧ください

モデルの保存状態

各モデルインスタンスは個別のPythonオブジェクトであり、互いに情報を理解していません。

1
2
3
4
5
6
7
8
track 1=await Track. object.get(name='The Bird')
track 2=await Track. object.get(name='The Bird')
assert track 1==track 2#True

track1.name='The Bird 2'
Waittrack1.save()
asserttrack1.name==track2.name#False
#track 2は更新されず、track 1について何も知らない

オブジェクト自体には保存状態があり、以下のように設定されています。

  • 挿入メソッドをモデルに保存/更新/ロード/更新した後、モデルを保存します
  • モデル保存後の create/get/first/all/get_or_create/update_or_create メソッド
  • モデルはbulk_updateとbulk_createに渡されたときに保存されます
  • ManyTomany関連オブジェクトを追加/削除した後、モデルを保存します(モデルインスタンスによる自動保存/削除)
  • 独自のフィールドを変更してもモデルは保存されません(Model.pkエイリアスとしてのpkを含む)
  • ForeignKey関連オブジェクトを追加/削除した後、モデルが保存されない(fk列が保存されない)
  • は__in it__を使用してインスタンス化した後、モデルを保存しません(QuerySet. createを使用しないか、saveを呼び出す前)

ModelInstanceを使用して、モデルが保存されているかどうかを確認できます。保存されたプロパティ