2012-05-19 108 views
1

假設我有一個包含1M個電子郵件地址的CSV文件。我需要通過文件迭代,並添加每個條目,例如:在django中執行批量SQL插入

with open(file) as csv: 
    for item in csv: 
     Email.objects.create(email=item) 

這似乎將是非常慢的經歷Django的ORM這樣創造1M對象並將其插入到數據庫。有沒有比這更好的方法,還是應該離開django完成這個任務,並直接使用db?

+0

您不應該使用'csv'作爲變量,因爲它是內置模塊的名稱。 –

回答

1

除了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()實例(發電機似乎不在這裏工作)

此外,你可以do it in SQL-level directly

1

因爲您繞過了創建所有模型對象,所以您應該放到DB-API中完成。

1

恕我直言,我看不出有很大的問題,如果速度這只是一次性的刀片(1M記錄將不帶你小時)。如果將來使用django api訪問這些對象,那麼可能應該避免使用SQL級別插入,並通過django的方法執行操作,如livar所示(如果使用django 1.4)

0

你可能要考慮的Django DSE包,這顯然是一個有效的批量插入/更新庫。