2010-12-13 80 views
2
  • 我有一個CSV文件列表,我需要在數據庫中存儲項目。批次存在檢查+保存 - Django的

  • 我需要檢查哪些項目尚未保存,如果沒有保存我需要將它們保存在數據庫中。

  • 還有2-5萬行。


該模型是Django的用戶模型。

我有這種形式的CSV文件:

的Item_ID,Policy_number,性別,職務,開始_

這是代碼:

import csv 

reader = csv.reader(open('items.csv', 'rb')) 

for index, row in enumerate(reader): 
    if User.objects.filter(username=row[2]).count(): 
     continue 
    try: 
     user = User(username=row[2],last_name=row[1],password='*') 
     user.save() 
    except Exception, e: 
     print e 
    del user 
    del row 
    del index 

任何你會推薦的方法?

+0

爲什麼'del'?這是自動處理的。這很少有很好的理由。你的模型定義是什麼?具體來說,你在'username'屬性中指定了哪些索引選項? – 2010-12-13 17:58:48

回答

1

您將要加載CSV文件,然後使用get_object_or_create方法來檢查,看看是否存在該對象要經過的每一行,如果沒有,那麼它會爲您創建它。如果您向我們展示models.py代碼,我們可能會更具體地幫助您。

+0

這似乎是最快的方式謝謝!歡迎您致電 – RadiantHex 2010-12-14 13:30:52

+0

,很高興爲您服務 – TheLifeOfSteve 2010-12-16 18:56:42

2

視情況而定。如果CSV數據可以被轉換成一個模型,這樣的事情應該做的:

  • 負載CSV數據
  • 每一行:
    • 檢查,如果它的模型存在
    • 如果不是:
      • 創建基於數據的新模型,並進行保存。

編輯:
我認爲存在的一批支票將是困難的。 模型的批量保存會更快,但取決於模型的複雜性,我認爲每個模型都可以保存。

+0

感謝您的回覆:)我已經這樣做了:600k行之後的內存使用量1.1Gb,而且太慢了:) – RadiantHex 2010-12-13 14:48:57

+0

所以你完成了嗎? :) – 2010-12-13 14:49:46

+0

@RadiantHex:如果它很慢,你必須問一個不同的問題。你需要提供實際的模型和實際的代碼,並且你需要確保你的查找是簡單的「精確」匹配,並且你有索引。接受這個答案,搜索「Django慢查詢」,並且 - 如果需要的話 - 打開一個新問題。 – 2010-12-13 14:57:34

1

如果你的內存可以處理的用戶名變量,這可能是一個很好的優化。

import csv 

reader = csv.reader(open('items.csv', 'rb')) 

usernames = User.objects.values('username') 

for index, row in enumerate(reader): 
    if row[2] in usernames: 
     continue 
    User.objects.create(username=row[2],last_name=row[1],password='*') 

如果真的有內存問題,您可以看看例如這個(現有的)答案: Question about batch save objects in Django

1

試試這個。count()將是非常昂貴的。

for index, row in enumerate(reader): 
    try: 
     User.objects.get(username=row[2]) 
    except User.DoesNotExist: 
     user = User(username=row[2],last_name=row[1],password='*') 
     user.save()