コンテンツにスキップ

データベースからデータを削除する

次の方法では、データベースからデータを削除できます。

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

  • モデル

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

    • QuerysetProxy. remove()メソッド

    • QuerysetProxy. clear()メソッド

削除する

delete(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 in Space", author="Tolstoy, Leo", genre="Fantasy"
    )
    await Book.objects.create(
        title="Anna Karenina", author="Tolstoy, Leo", genre="Fiction"
    )

    # delete accepts kwargs that will be used in filter
    # acting in same way as queryset.filter(**kwargs).delete()
    await Book.objects.delete(genre="Fantasy")  # delete all fantasy books
    all_books = await Book.objects.all()
    assert len(all_books) == 2


asyncio.run(run_query())

モデルメソッド

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

削除する

delete()メソッドを呼び出すことで、モデルインスタンスを削除できます。

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

QuerysetProxyメソッド

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

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

排除する

関連するモデルを1つずつ削除します。

データベースからリレーションシップを削除します。

keep_逆フラグをFalseormarに指定すると、関連するモデルもデータベースから削除されます。

 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
class Album(ormar. Model):
    base_or_config. copy()

    id: int=ormar.Integer(プライマリキー=True)
    name: str=ormar.String(max_length=100)
    is_best_セラー: bool=ormar.Boolean(デフォルト=False)

class Track(ormar. Model):
    base_or_config. copy()

    id: int=ormar.Integer(プライマリキー=True)
    アルバム:オプション[Album]=ormar. ForeignKey(Album)
    title: str=ormar.String(max_length=100)
    位置: int=ormar.Integer()
    play_count: int=ormar.Integer(nullable=True)


アルバム=awaitアルバム(name="Malibu"). save()
track 1=awaitトラック(
    アルバム=アルバム、タイトル=「鳥」、ポジション=1、プレイカウント=30、
). save()
#関係の裏側からプロキシを介して削除する
awaitアルバム. tracks.remove(track 1,keep_反転=False)

#トラックも削除されましました。
tracks=await Track. object.all()
トラックの長さ==0

クリア

関連するすべてのモデルを1回の呼び出しで削除します。

データベース内のリレーションシップも削除します。

keep_逆フラグをFalseormarに指定すると、関連するモデルもデータベースから削除されます。

 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
class Album(ormar. Model):
    base_or_config. copy()

    id: int=ormar.Integer(プライマリキー=True)
    name: str=ormar.String(max_length=100)
    is_best_セラー: bool=ormar.Boolean(デフォルト=False)

class Track(ormar. Model):
    base_or_config. copy()

    id: int=ormar.Integer(プライマリキー=True)
    アルバム:オプション[Album]=ormar. ForeignKey(Album)
    title: str=ormar.String(max_length=100)
    位置: int=ormar.Integer()
    play_count: int=ormar.Integer(nullable=True)


アルバム=awaitアルバム(name="Malibu"). save()
track 1=awaitトラック(
    アルバム=アルバム,
    タイトルは「The Bird」。
    位置=1、
    play_count=30、
). save()
track 2=awaitトラック(
    アルバム=アルバム,
    タイトルは「Heart Don't Stand a Chance」。
    位置=2、
    play_count=20,
). save()

#リレーションのみを削除->トラック上の外部キーをクリア
awaitアルバム.トラック.クリア()

#トラックも削除
awaitアルバム. tracks.clear(keep_反転=False)