Django中的批量插入,修改

性能问题

写代码最终要的两点是什么?我认为1是功能的实现问题。2是代码的运行速度问题也就是代码的优化问题。
一般来说普通的新增或修改使用Django提供的API最直接的create和update或者加上锁的select_for_update等
看一下对比代码如下:

单条插入

for i in range(1000):
	Stduent.objects.create(id=xxx,name=xxx)

单条修改

for i in range(1000):
	Stduent.objects.update(name=xxx)

这种代码功能是可以实现但是让人一看就感觉写代码的人像个XX,一点都不会想到代码的优化,看着还别扭。像这种一口气插入很多条的一般使用多条插入的方法。

多条插入

student_list = []
for i in range(1000):
	student = Stduent(id=xxx,name=xxx)
	student_list.append(student_list)
Stduent.objects.bulk_create(student_list)

多条修改

student_list = []
for i in range(1000):
	student = Stduent(name=xxx)
	student_list.append(student_list)
Stduent.objects.bulk_update(student_list)

bulk_create和bulk_update方法的参数是一个对象集合。注意是对象集合。里面存放的都是一个个对象。像上面的代码,先申请一个集合用来存放对象。在for循环里使用对象初始化,初始化完存入集合不用对象.save(),当执行完毕之后,最后执行bulk_create或bulk_update一口气全部新增。这个就和java的在mapper文件中使用foreach一样。

<foreach collection="ids" item="user_id" open="AND (" close=")" separator="OR">
 //代码块
</foreach>

这种方式比单条插入的好处在于不用每次添加都访问数据库。要知道当需要添加的数据变多后。每条都访问数据库这个代价是相当的大。就像为什么项目中有的地方要使用缓存一样。就是为了减轻数据库压力。如果数据库被压死。那整个项目就崩了。
还有一点我的理解就是为了代码的美观性和可读性,在写代码的时候尽量能封装方法就封装方法。因为一个函数中一大串代码看起来真的很费劲。

最后提前祝大家新年快乐!

你可能感兴趣的:(python,Django)