Djangoのtransaction配下のモジュールはデコレータでありコンテキストマネージャであった!
Djangoでトランザクション制御するときに使うデコレータ
Djangoでトランザクション制御するときは、django.db.transaction配下にある
- commit_on_success
- commit_manually
こういうデコレータを使います。
from django.db import transaction @transaction.commit_on_success def save_data(cls, values): obj = cls(**values) obj.save()
こんなやつですね。
transaction配下のデコレータ達は実はwith文でも使えた!
これを知らなかったわけですが、このcommit_on_successとかはデコレータだけでなく、コンテキストマネージャでもあるので、with文でも使えるのです。
from django.db import transaction from apps.user.models import User def main(): with transaction.commit_on_success(using="master"): user = User(id=1, name="easy", age=13) user.save() print("ok")
こんな風にも使えるんですね。
この場合、withブロックを出たときに例外がでなかったらcommit、出たらrollbackされるようになります。
これはよくできていると思いました。