You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 06:52:10