标签:django 批量 插入 bulk_create 源码
使用django orm大批量插入的时候我们可以不使用for循环对一个一个的save而是使用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)
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)
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]) [<Area: Area object>, <Area: Area object>]
本文出自 “orangleliu笔记本” 博客,转载请务必保留此出处http://blog.csdn.net/orangleliu/article/details/41806263
作者orangleliu 采用署名-非商业性使用-相同方式共享协议
标签:django 批量 插入 bulk_create 源码
原文地址:http://blog.csdn.net/orangleliu/article/details/41806263