コンテンツにスキップ

データベースのデータを更新します

次のメソッドと関数を使用すると、データベース内の既存のデータを更新できます。

  • update(each: bool = False, **kwargs) -> int

  • update_or_create(**kwargs) -> Model

  • bulk_update(objects: List[Model], columns: List[str] = None) -> None

  • モデル

    • Model. update()メソッド
    • Model. upsert()メソッド
    • Model.save()メソッド
    • クエリセットエージェント

    • QuerysetProxy.update_or_create(**kwargs) 方法

更新する

update(each: bool = False, **kwargs) -> int

QuerySetレベルの更新は、同じ値を持つ複数のレコードを一度に更新するために使用されます。

最初にQuerySetをフィルタリングするか、each=Trueフラグを指定してテーブル全体を更新する必要があります。

このフラグまたはフィルターを指定しないと、QueryDefinitionErrorが発生します。

更新された行数を返します。

 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
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(
        tablename="books",
    )

    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"
    )

    await Book.objects.update(each=True, genre="Fiction")
    all_books = await Book.objects.filter(genre="Fiction").all()
    assert len(all_books) == 3


asyncio.run(run_query())

!!!予期しない上書きを防ぐために、警告が更新される前にクエリセットをフィルタリングする必要があります。

1
データベーステーブル全体を更新するには、`each=True` を安全スイッチとして提供する必要があります。

更新または作成

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_update(objects: List["Model"], columns: List[str] = None) -> None

一度に複数のインスタンスを更新できます。

渡されたすべてのモデルは、プライマリキーカラムを埋める必要があります。

列のリストを文字列名のリストとして渡すことで、更新するフィールドを選択することもできます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#bulk_createから例を続ける
#オブジェクトの更新
to doのto doについて:
    完了=False

#すべてのオブジェクトを一度に更新する
#オブジェクトはpk列を設定する必要があります。そうしないと例外が発生します。
await To Do. object.bulk_update(to do)

完了=await To Do. object.filter(完了=False).all()
assert len(完了)==3

モデルメソッド

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

更新

モデルのプロパティ(フィールド)を更新し、update()メソッドを呼び出すことでモデルを更新できます。

主キーを設定せずにモデルを更新しようとすると、ModelPersistenceError例外が発生します。

!!!ヒントモデル更新のupdate()メソッドの詳細を読む

更新の挿入

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

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

保存関連

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

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

QuerysetProxyメソッド

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

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

更新または作成

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

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