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>

這種方式比單條插入的好處在於不用每次添加都訪問數據庫。要知道當需要添加的數據變多後。每條都訪問數據庫這個代價是相當的大。就像爲什麼項目中有的地方要使用緩存一樣。就是爲了減輕數據庫壓力。如果數據庫被壓死。那整個項目就崩了。
還有一點我的理解就是爲了代碼的美觀性和可讀性,在寫代碼的時候儘量能封裝方法就封裝方法。因爲一個函數中一大串代碼看起來真的很費勁。

最後提前祝大家新年快樂!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章