取引する
データベーストランザクションは、非同期クエリを発行するために使用されるエンコーディング/データベースのためにサポートされています。
基本的な使い方
トランザクションを使用するには、データベース.トランザクションを非同期コンテキストマネージャーとして使用します。
| データベースと非同期のトランザクション():
#ここで呼ばれるものはすべて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
|
任意の非同期関数の関数デコレータとして.トランザクション()を使用することもできます。
| @データベーストランザクション()
async def create_users(request):
...
|
トランザクションブロックは、タスクのローカル状態として管理されます。ネストされたトランザクションは完全にサポートされており、データベースセーブポイントを使用して実装されます。
手動でコミット/ロールバック
下位レベルの取引APIの場合は、手動でトリガーできます
| トランザクション=awaitデータベース。トランザクション()
トライ:
awaitトランザクション. start()
...
除く:
awaitトランザクション. rollback()
その他:
awaitトランザクション. commit()
|
テスト
トランザクションは、強制ロールバックを適用でき、各テスト後にデータをクリーンアップする必要がない場合にも、テスト中に役立ちます。
| @pytest. mark.asyncio
async def sample_test():
データベースと非同期:
データベースと非同期のトランザクション(force_rollback=True):
#テストコードはこちら
...
|