django批量插入存在表关联的多表数据应该怎么提高性能呢

x33g5p2x  于2021-12-30 转载在 Go  
字(0.8k)|赞(0)|评价(0)|浏览(405)

一、前言

最近粉丝遇到了一个问题:需要往数据库A表和B表(B表存在字段关联A表id的数据)一次性插入1000条数据。他通过先插一条A表数据并获取它的id再来插入B表数据并进行关联。实际运行效果可想而知,速度是非常慢的。

在django中有个BULK_CREATE方法可以实现批量插入数据的操作,那位小伙伴也尝试了,但由于这些数据是同时插入的,所以通过ORM插入后返回的属性没有数据的id,导致无法插入关联的B表数据。

二、解决方案

对于这种场景我们可以手动的指定数据的id就可以解决这个问题了。

当我们要插入数据的时候,先删除表中原来的数据,然后指定每个id,再进行插入即可,伪代码如下:

your_modelA.objects.delete()
your_modelB.objects.delete()
insert_data = [{'name': 'zs', 'age': 18}, {'name': 'zs', 'age': 18}] # 要创建的数据,随便模拟的
modelA_insert_data = []
modelB_insert_data = []
for i, _data in enumerate(insert_data):
    A_id = i + 1
    _data.update({'id': i + 1})
    modelA_insert_data.append(your_modelA(**_data))
    modelB_insert_data.append(your_modelB(**{**_data, **{'A_id': A_id}}))  # A_id为关联字段
your_modelA.objects.bulk_create(modelA_insert_data)
your_modelB.objects.bulk_create(modelB_insert_data)

新专栏《从0构建自动化测试平台》 欢迎订阅支持!

相关文章