コンテンツにスキップ

データベースへのデータの挿入

次のメソッドを使用すると、データベースにデータを挿入できます。

  • 作成(**kwargs)->モデル

  • get_or_create(_defaults: Optional[Dict[str, Any]] = None, **kwargs) -> Tuple[Model, bool]

  • update_or_create(**kwargs) -> Model

  • bulk_create(objects: List[Model]) -> None

  • モデル*Model.save()メソッド*Model. upsert()メソッド*Model.save()メソッド

  • クエリセットエージェント*QuerysetProxy.create(**kwargs) メソッド*QuerysetProxy.get_or_create(_defaults: Optional[Dict[str, Any]] = None, **kwargs) メソッド*QuerysetProxy.update_or_create(**kwargs) メソッド

創造する

作成(**kwargs):->モデル

モデルインスタンスを作成し、データベースに保存し、モデルの更新を返します(渡されず、自動増分が設定されている場合はpkを入力します)。

許可されるkwargsは、モデルフィールド名と正しい値型です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
class Album(ormar. Model):
    ormar_config=ormar. OrmarConfig
        データベース=データベース、
        metadata=メタデータ,
        tablename="アルバム"
    )


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


malibu=await Album. object.create(name="Malibu")
await Track. object.create(アルバム=malibu,タイトル="The Bird",ポジション=1)

もう1つの方法は、モデルの分割作成と永続化です。

1
2
malibu=アルバム(name="Malibu")
Waitmalibu.save()

Tipモデル内の他のモデルメソッドをチェックします

取得または作成

get_or_create(_defaults: Optional[Dict[str, Any]] = None, **kwargs) -> Tuple[Model, bool]

メソッドの作成と取得の組み合わせです。

条件を満たすローを取得しようとすると、NoMatch例外が発生した場合、指定されたkwargsと_defaaultを使用して新しいローが作成されます。

_defaaultディクショナリを指定すると、明示的に指定された値の上書きを含め、_defaaultで設定された値が常に設定されます。IE get_or_create(_defaults: {"title": "I win"}, title="never used") kwargsで独自の値を提供するかどうかにかかわらず、タイトルには常に「私が勝った」が使用されます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
class Album(ormar. Model):
    ormar_config=ormar. OrmarConfig
        データベース=データベース、
        metadata=メタデータ,
        tablename="アルバム"
    )

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


アルバム、作成=await Album. object.get_or_create(name='The Cat',_default={"year": 1999})
assert作成はTrue
アサートalbum.name=="猫"
assertアルバム.年==1999
#オブジェクトは存在しないため作成されます
Album 2、作成=await Album. object.get_or_create(name='The Cat')
assert作成はFalse
アルバムをアサートする==アルバム2
#return同じdb行が返されるとTrue

!!!は、データベース内の同等の行であるにもかかわらず、上記の例のアルバムとアルバム2は2つの異なるPythonオブジェクトであると警告しています。これらのオブジェクトの1つを更新しても、データベースから新しいデータを明示的に読み込むまで、2番目のオブジェクトは更新されません。

新しいオブジェクトを作成する場合は、pk列の値を渡すか、pk列を自動増分に設定する必要があることに注意してください

更新または作成

update_or_create(**kwargs) -> Model

モデルを更新するか、データベースに一致するものがない場合に新しいモデルを作成します。

 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
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 Book(ormar.Model):
    ormar_config = ormar_base_config.copy()

    id: int = ormar.Integer(primary_key=True)
    title: str = ormar.String(max_length=200)
    author: str = ormar.String(max_length=100)
    genre: str = ormar.String(
        max_length=100,
        default="Fiction",
    )


@create_drop_database(base_config=ormar_base_config)
async def run_query():
    await Book.objects.create(
        title="Tom Sawyer", author="Twain, Mark", genre="Adventure"
    )
    await Book.objects.create(
        title="War and Peace", author="Tolstoy, Leo", genre="Fiction"
    )
    await Book.objects.create(
        title="Anna Karenina", author="Tolstoy, Leo", genre="Fiction"
    )

    # if not exist the instance will be persisted in db
    vol2 = await Book.objects.update_or_create(
        title="Volume II", author="Anonymous", genre="Fiction"
    )
    assert await Book.objects.count() == 4

    # if pk or pkname passed in kwargs (like id here) the object will be updated
    assert await Book.objects.update_or_create(id=vol2.id, genre="Historic")
    assert await Book.objects.count() == 4


asyncio.run(run_query())

新しいオブジェクトを作成する場合は、pk列の値を渡すか、pk列を自動増分に設定する必要があることに注意してください

一括作成

bulk_create(objects: List["Model"]) -> None

一度に複数のオブジェクトを作成できます。

モデルオブジェクトの有効なリストを渡す必要があります。

 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
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 ToDo(ormar.Model):
    ormar_config = ormar_base_config.copy(tablename="todos")

    id: int = ormar.Integer(primary_key=True)
    text: str = ormar.String(max_length=500)
    completed = ormar.Boolean(default=False)


@create_drop_database(base_config=ormar_base_config)
async def run_query():
    # create multiple instances at once with bulk_create
    await ToDo.objects.bulk_create(
        [
            ToDo(text="Buy the groceries."),
            ToDo(text="Call Mum.", completed=True),
            ToDo(text="Send invoices.", completed=True),
        ]
    )

    todoes = await ToDo.objects.all()
    assert len(todoes) == 3


asyncio.run(run_query())

モデルメソッド

各モデルインスタンスには、それ自体を保存、更新、または読み込むための一連のメソッドがあります。

節約

QuerySet. create()メソッドを使用するか、モデルを通常のpydanticモデルに初期化してからsave()メソッドを呼び出して新しいモデルを作成できます。

!!!ヒントモデル保存の保存()メソッドの詳細を読む

更新の挿入

モデルのsave()またはupdate(**kwargs)メソッドのプロキシです。pkが設定されていない場合、save()メソッドが呼び出されます。

!!!ヒントupsert()メソッドの詳細については、モデル-upsertを参照してください

保存関連

メソッドは、メソッドを呼び出したモデルのすべてのリレーションシップを走査し、保存されていないモデルごとにupsert()メソッドを呼び出します。

!!!ヒントモデルの保存された()メソッドの詳細を読む

QuerysetProxyメソッド

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

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

創造する

上記の作成関数と全く同じですが、リレーションシップの反対側から関連オブジェクトを作成することができます。

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

取得または作成

上記のget_or_create関数とまったく同じですが、リレーションシップの反対側から関連するオブジェクトをクエリしたり、作成したりすることができます。

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

更新または作成

上記のupdate_or_create関数とまったく同じですが、リレーションシップの反対側から関連するオブジェクトを更新または作成できます。

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