程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [Django]bulk_create 探究

[Django]bulk_create 探究

編輯:C++入門知識

[Django]bulk_create 探究


使用django orm大批量插入的時候我們可以不使用for循環對一個一個的save而是使用 bulk_create來批量插入,可是使用了這個方法還需要在自己添加一個事務嗎? 還是django本身對這個方法進行了事務的封裝?
查看了源碼(django1.5):在 django/db/models/query.py 中,看到這樣的片段
with transaction.commit_on_success_unless_managed(using=self.db):
            if (connection.features.can_combine_inserts_with_and_without_auto_increment_pk
                and self.model._meta.has_auto_field):
                self._batched_insert(objs, fields, batch_size)
            else:
                objs_with_pk, objs_without_pk = partition(lambda o: o.pk is None, objs)
                if objs_with_pk:
                    self._batched_insert(objs_with_pk, fields, batch_size)
                if objs_without_pk:
                    fields= [f for f in fields if not isinstance(f, AutoField)]
                    self._batched_insert(objs_without_pk, fields, batch_size)

這裡我們看到了一個transaction的調用 transaction.commit_on_success_unless_managed(using=self.db),那麼這句話是什麼意思呢? 看看他的定義: django/db/transaction.py中
def commit_on_success_unless_managed(using=None, savepoint=False):
    """
    Transitory API to preserve backwards-compatibility while refactoring.
 
    Once the legacy transaction management is fully deprecated, this should
    simply be replaced by atomic. Until then, it's necessary to guarantee that
    a commit occurs on exit, which atomic doesn't do when it's nested.
 
    Unlike atomic, savepoint defaults to False because that's closer to the
    legacy behavior.
    """
    connection = get_connection(using)
    if connection.get_autocommit() or connection.in_atomic_block:
        return atomic(using, savepoint)
    else:
        def entering(using):
            pass
 
        def exiting(exc_type, using):
            set_dirty(using=using)
 
        return _transaction_func(entering, exiting, using)

沒怎麼看懂這個方法的解釋,從代碼結構來看應該是有事務的。 那自己做個試驗把,往數據庫批量插入2條數據,一個正確的,一個錯誤的看看結果如何?
ipython做了個試驗
from mngm.models import Area
a1=Area(areaname="China", code="CN", parentid='1', level='3')
a2=Area(id=1, areaname="China", code="CN", parentid='1', level='3')  #錯誤的記錄
Area.objects.bulk_create([a1, a2])
IntegrityError: (1062, "Duplicate entry '1' for key 'PRIMARY'")
 
a2=Area(areaname="Chinaa", code="CN", parentid='1', level='3')        #正確的記錄
Area.objects.bulk_create([a1, a2])
[, ]
所以這個操作框架已經實現了事務處理,不需要自己再添加事務就好了。
你可能正好不需要這種事務處理,看看 https://rodmtech.net/docs/django/django-bulk_create-without-integrityerror-rollback/

本文出自 “orangleliu筆記本” 博客,轉載請務必保留此出處http://blog.csdn.net/orangleliu/article/details/41806263

作者orangleliu 采用署名-非商業性使用-相同方式共享協議



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved