コンテンツにスキップ

取引する

データベーストランザクションは、非同期クエリを発行するために使用されるエンコーディング/データベースのためにサポートされています。

基本的な使い方

トランザクションを使用するには、データベース.トランザクションを非同期コンテキストマネージャーとして使用します。

1
2
3
4
5
データベースと非同期のトランザクション():
    #ここで呼ばれるものはすべて1つのトランザクションになります
    await Model 1(). save()
    await Model 2(). save()
    ...

!!!noteモデルのormar_configオブジェクトで使用されているデータベースと同じである必要があることに注意してください。

コード内でデータベースインスタンスを渡さないようにするために、各モデルからインスタンスを抽出できます。ormar. Model宣言中に提供されたデータベースは、ormar_config.databaseから取得でき、クラスとインスタンスからアクセスできます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
データベースのインポート
sqlalchemyをインポート
インポートまたは


base_or_config=オーマコンフィグ(
    metadata=sqlalchemy. MetaData(),
    データベース=データベース。データベース("sqlite:///")、
)


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

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

#データベースはクラスからアクセス可能です
データベース=Author. ormer_config.database

#インスタンスからだけでなく
著者=著者(name="Stephen King")
データベース=Author_config. Database

任意の非同期関数の関数デコレータとして.トランザクション()を使用することもできます。

1
2
3
@データベーストランザクション()
async def create_users(request):
    ...

トランザクションブロックは、タスクのローカル状態として管理されます。ネストされたトランザクションは完全にサポートされており、データベースセーブポイントを使用して実装されます。

手動でコミット/ロールバック

下位レベルの取引APIの場合は、手動でトリガーできます

1
2
3
4
5
6
7
8
トランザクション=awaitデータベース。トランザクション()
トライ:
    awaitトランザクション. start()
    ...
除く:
    awaitトランザクション. rollback()
その他:
    awaitトランザクション. commit()

テスト

トランザクションは、強制ロールバックを適用でき、各テスト後にデータをクリーンアップする必要がない場合にも、テスト中に役立ちます。

1
2
3
4
5
6
@pytest. mark.asyncio
async def sample_test():
    データベースと非同期:
        データベースと非同期のトランザクション(force_rollback=True):
            #テストコードはこちら
            ...