2016-08-10 13 views
0

Djangoでトランザクションベースのクエリを実装する際に、自分のコードを改善する方法を知りたいと思います。djangoに基づくトランザクション

これは、私がdjangoのドキュメントで読んだATOMIC_REQUESTを理解する方法です。私はこの機能ビューを持っています:

from django.db import transaction 
import sys 
@transaction.atomic 
def save_progress(request): 
    try: 
     with atomic.transaction(): 
      qs = AllProgressModel() 
      qs.name = 'level up' 
      qs.level = 25 
      qs.description = 'Increased 2 level' 
      qs.save() 
    except: 
     print(sys.exc_info()) 

- 私はそれを正しくしていますか?
- 保存中に接続が失われた場合、進行状況が保存されるかどうかを確認します。
ありがとうございます!

答えて

1

デコレータ@transaction.atomicwith atomic.transaction()の両方を使用する必要はありませんが、通常は1つで十分です。

with atomic.transaction()を使用している間に、一度にすべての例外を広範に処理するのではなく、IntegrityError例外をキャッチします。

編集:アトミックブロック外の例外を処理している場合(以下同様) 。

from django.db import IntegrityError, transaction 
def save_progress(request): 
    try: 
     # with atomic.transaction() -> produce error (typo) 
     with transaction.atomic(): 
      ... 
      qs.name = 'level up' 
      qs.level = 25 
      qs.description = 'Increased 2 level' 
      qs.save() 
    except IntegrityError: 
     # You are here if something goes within the transaction, after rollback 
     # HANDLE exception 
+0

ご迷惑をおかけしました。 1つだけを使用しますか?しかし、djangoのドキュメンテーションの例の1つは、2つを使用しています。 –

+0

https://docs.djangoproject.com/en/1.10/topics/db/transactions/明示的に制御する取引について –

+0

混乱して申し訳ありません。このような例外を処理する場合は、正しいです。より良い方法です。私はあなたが2番目のものが必要な理由をもっと明確にするために編集しました。 –

関連する問題