2010-07-09 102 views
6

在python中,我使用importmany來填充SQLITE數據庫,所以我可以一次導入數以萬計的數據行。我的數據被包含爲元組列表。我有我的數據庫設置與我想要他們的主鍵。在IntegrityError後繼續加載

我遇到的問題是主鍵錯誤會引發IntegrityError。如果我處理異常,我的腳本將在主鍵衝突處停止導入。
嘗試:

try: 
    self.curs.executemany("INSERT into towers values (NULL,?,?,?,?)",self.insertList) 
except IntegrityError: 
    print "Primary key error" 
conn.commit() 


所以我的問題是,在使用Python importmany可我:

1.捕獲違反主鍵的值是多少?
2.在出現主鍵錯誤後繼續加載數據。

我得到爲什麼它不會繼續加載,因爲在將異常數據提交到數據庫之後。但是我不知道如何繼續我離開的地方。

Unforutnley我無法複製和粘貼此網絡上的所有代碼,任何幫助將不勝感激。現在我有沒有的PK設定爲周圍的工作......

回答

0

使用for循環遍歷列表並使用execute而不是executemany。圍繞for循環與您的嘗試,並在異常後繼續執行。類似這樣的:

for it in self.insertList: 
    try: 
     self.curs.execute("INSERT into towers values (NULL,?,?,?,?)",it) 
    except IntegrityError: 
     #here you could insert the itens that were rejected in a temporary table 
     #without constraints for later use (question 1) 
     pass 
conn.commit() 

你甚至可以統計列表中有多少項被真正插入。

+0

據我所知,存在'executemany'是因爲它比python迭代的'execute'命令提供了顯着的速度提升。因此,您的解決方案雖然可行,但會顯着降低巨大的數據導入速度。一種解決方案是跟蹤已經添加到python集合中的主鍵,並在將其提供給遊標之前提前過濾insertList。 – 2012-07-15 22:08:59

+0

@PeterMcMahan好的我同意。這不是有效的代碼。它只能像你說的那樣「有效」。 – jheyse 2012-07-16 22:26:00