假設我有一個包含1M個電子郵件地址的CSV文件。我需要通過文件迭代,並添加每個條目,例如:在django中執行批量SQL插入
with open(file) as csv:
for item in csv:
Email.objects.create(email=item)
這似乎將是非常慢的經歷Django的ORM這樣創造1M對象並將其插入到數據庫。有沒有比這更好的方法,還是應該離開django完成這個任務,並直接使用db?
假設我有一個包含1M個電子郵件地址的CSV文件。我需要通過文件迭代,並添加每個條目,例如:在django中執行批量SQL插入
with open(file) as csv:
for item in csv:
Email.objects.create(email=item)
這似乎將是非常慢的經歷Django的ORM這樣創造1M對象並將其插入到數據庫。有沒有比這更好的方法,還是應該離開django完成這個任務,並直接使用db?
除了bulk_create
,你可以把所有插入到一個事務,只要你的數據庫後端支持它:
from django.db.transaction import commit_on_success
# with commit_on_success(), open(file) as csv: # in Python2.7
with commit_on_success():
for item in csv:
Email.objects.create(email=item)
還要注意的是bulk_create
對待項w /相同的價值觀是相同的,因此
Email.objects.bulk_create([Email(email=item), Email(email=item)])
實際上CR eates一排,而不是兩個
因爲越來越SQLS好轉,交易解決方案仍然比bulk_create
一個慢一些,但您不必在內存中創建100萬個Email()
實例(發電機似乎不在這裏工作)
因爲您繞過了創建所有模型對象,所以您應該放到DB-API中完成。
您也可以嘗試使用新bulk_create
恕我直言,我看不出有很大的問題,如果速度這只是一次性的刀片(1M記錄將不帶你小時)。如果將來使用django api訪問這些對象,那麼可能應該避免使用SQL級別插入,並通過django的方法執行操作,如livar所示(如果使用django 1.4)
你可能要考慮的Django DSE包,這顯然是一個有效的批量插入/更新庫。
您不應該使用'csv'作爲變量,因爲它是內置模塊的名稱。 –