2012-12-01 132 views
7

我正在使用cursor.executemany將CSV文件中的批次行插入到SQLite表中,其中一些預計將基於主鍵字段進行重複。當我執行命令時,我可預見地得到一個完整性錯誤,沒有任何東西被插入。在SQLite中插入唯一的行(python)

我該如何有選擇地插入非重複行而不必提前手動過濾它們?我知道在純Python中,您可以簡單地創建一個錯誤異常並跳過重複行 - 是否有類似的東西可以在此用例中實現?

+0

您可以[EAFP(http://docs.python.org/2/glossary.html#term-eafp)每批在IntegrityError的情況下,你得回過頭通過專線接入線路,而不是本批執行許可;再次,只是EAFP的每一行,並忽略IntegrityError。 –

+0

好的,我想我明白了。我是SQLite的新手 - 但是這是我想在BEGIN/END事務中包裝以使其更有效嗎? – ChrisArmstrong

回答

1

一種方法是簡單地使用錯誤捕獲手動寫出循環,而不是使用executemany

僞代碼:

for row in csvfile: 
    try: 
     cursor.execute('INSERT INTO X (Y) VALUES (%s)' % row[rowdatapoint]) 
    except IntegrityError: 
     pass 

大概不到預期的效果executemany,但它會抓住短暫進入,將可能涉及您預生成一個巨大的INSERT SQL字符串更復雜的SQL改變你的錯誤。