2017-05-16 10 views
0

以下の静的メソッド(flaskyから取得)は、データベースに偽のデータを取り込むための方法で、Djangoにインポートします。DjangoでIntegrityErrorが発生した場合にデータベースをロールバックする方法は?

models.py

class User(UserMixin, db.Model): 

    # ...... 

    @staticmethod 
    def generate_fake(count=100): 
     from sqlalchemy.exc import IntegrityError 
     from random import seed 
     import forgery_py 

     seed() 
     for i in range(count): 
      u = User(email=forgery_py.internet.email_address(), 
        username=forgery_py.internet.user_name(True), 
        password=forgery_py.lorem_ipsum.word(), 
        confirmed=True, 
        name=forgery_py.name.full_name(), 
        location=forgery_py.address.city(), 
        about_me=forgery_py.lorem_ipsum.sentence(), 
        member_since=forgery_py.date.date(True)) 
      db.session.add(u) 
      try: 
       db.session.commit() 
      except IntegrityError: 
       db.session.rollback() 

私はUser.objects.create(...)ような何かを行うことができますが、問題は、ですが、私は(原因重複する主キーに推測)IntegrityErrorが発生した場合にデータベースをロールバックする方法がわかりません。

答えて

3

デフォルトでは、Djangoはすべてのクエリがトランザクションでラップされる自動コミットモードでSQLクエリを作成します。したがって、データベースの完全性エラーを心配する必要はありません。整合性エラーが発生した場合、Djangoはデータを挿入しません。

from django.db import transaction 

with transaction.atomic(): 
    User.objects.create(...) 

しかし、それが不要になります:

あなたはジャンゴで、Pythonのコンテキストハンドラとして実装されていることを、トランザクション内で作成コードをラップすることができ、余分な安全のために!トランザクションとDjangoがそれらをどのように扱うかについては、this documentation pageで詳しく読むことができます。

+0

私は単純に 'except IntegrityError:pass'と書くことができますか? –

+1

確かに、警告の言葉:IntegrityErrorは、Djangoではなく、データベースによって報告されたエラーの*エフェクト*です。データベースが整合性を気にしない場合、例外は発生せず、Djangoは何も通知しません。 – fixmycode

関連する問題