Django执行bulk_create后无法返回JsonResponse问题求助
Django bulk_create执行后无法返回JsonResponse进程挂起问题
问题详情
使用GET请求调用接口时,Django执行bulk_create()完成数据插入后无法返回JsonResponse,进程持续挂起。已确认数据成功写入数据库,控制台可打印objs的长度,但前端无响应。逐条插入数据功能正常,但100万条数据耗时过长。
环境信息
- Django 3.2.17
- Python 3.10
简化代码示例
objs = Entry.objects.bulk_create(entries) print(len(objs)) return JsonResponse({'inserted': str(len(objs))})
解决方案
1. 手动管控事务
bulk_create()默认在事务中执行,若存在未提交事务或连接未释放情况,可能导致挂起。显式用事务原子块包裹操作:
from django.db import transaction with transaction.atomic(): objs = Entry.objects.bulk_create(entries) print(len(objs)) return JsonResponse({'inserted': str(len(objs))})
2. 分批次插入大数据
100万条数据的列表会占用大量内存,阻塞后续响应流程。拆分批次执行bulk_create():
from django.db import transaction BATCH_SIZE = 10000 total_inserted = 0 for i in range(0, len(entries), BATCH_SIZE): batch_entries = entries[i:i+BATCH_SIZE] with transaction.atomic(): batch_objs = Entry.objects.bulk_create(batch_entries) total_inserted += len(batch_objs) print(total_inserted) return JsonResponse({'inserted': str(total_inserted)})
3. 手动刷新响应缓冲区
GET请求下,大内存操作后的响应可能因缓冲未刷新导致前端无反馈,手动触发缓冲刷新:
response = JsonResponse({'inserted': str(len(objs))}) response.flush() return response
4. 释放数据库旧连接
操作完成后主动释放闲置数据库连接,避免连接池耗尽或占用:
from django.db import close_old_connections objs = Entry.objects.bulk_create(entries) print(len(objs)) close_old_connections() return JsonResponse({'inserted': str(len(objs))})
内容的提问来源于stack exchange,提问作者THI double C
相关产品推荐
相关产品推荐

