针对多个记录的Django CRUD操作-transaction.atomic与bulk_create
我有一个Django 1.10模型和一个简单模型: 我有一个简单的REST端点,用于测试目的:针对多个记录的Django CRUD操作-transaction.atomic与bulk_create,django,Django,我有一个Django 1.10模型和一个简单模型: 我有一个简单的REST端点,用于测试目的: @api_view(['POST']) @transaction.atomic def r_test(request): for record in request.data: serializer = TestSerializer(data = record) if serializer.is_valid(): serializer.sa
@api_view(['POST'])
@transaction.atomic
def r_test(request):
for record in request.data:
serializer = TestSerializer(data = record)
if serializer.is_valid():
serializer.save()
…执行100条记录需要9秒(太慢)
如果我按照下面的方式重写它,它会立即执行
@api_view(['POST'])
def r_test(request):
obj_list = []
for record in request.data:
obj = Test(field1 = record['field1'])
obj_list.append(obj)
Test.objects.bulk_create(obj_list)
困扰我的是,我在许多资料中都读到,将函数包装到事务中(我通过添加decorator@transaction.atomic
)将显著改进多个操作情况下的插入操作。但我现在看不到这个
所以问题是,只有bulk_create()能够提供插入大数据的超高速,还是我在transaction.atomic
中做了一些错误的事情
更新:此外,我的设置中将原子请求设置为True
。顺便问一下,是不是设置有问题?比如说,Debug=True会阻止Django在单个事务中执行查询吗
更新2我尝试了使用decorator和使用transaction.atomic()将for循环包装在中的两种方法:
。但我仍然只观察到使用bulk\u create()
更新3。我的数据库是MySQL,对吗?我认为您应该首先改进api函数:
def r_test(request):
serializer = TestSerializer(data=request.data, many=True)
if serializer.is_valid():
serializer.save()
请重试。事务通常会加快插入过程。由于ATOMIC\u REQUESTS=True
,您已经处于事务中,因此在使用@transaction.ATOMIC()
时不会注意到差异。事务更快的主要原因是提交需要时间。在没有事务的情况下,Django使用自动提交模式,因此每个查询都会导致提交
在性能方面,事务并不是一个灵丹妙药。您仍在执行100个查询和100次到数据库的往返。即使您的数据库运行在同一个系统上,这也需要一些时间。这就是bulk\u create
发挥作用的地方。它执行单个查询以一次插入所有数据。您刚刚为自己保存了99次数据库往返。这比事务引起的任何加速都重要。可能不是问题,但您是否激活了django_debug_工具栏?我尝试过,但没有成功配置它,因为debug_工具栏在某些情况下会快速降低页面加载速度。特别是如果选中了SQL选项,你指的是什么页面?这只是一个REST端点。没有问题的页面我必须补充一点,如果您的数据库在同一个系统上,9秒100次查询仍然非常慢。若数据库在另一个系统上,那个么网络延迟可能会很快增加。不,数据库在另一个系统上。谢谢你的详细回答