2012-12-01 29 views
7

CSV dosyalarından satır gruplarını bir SQLite tablosuna eklemek için cursor.executemany kullanıyorum, bunların bir kısmı birincil anahtar alanına bağlı olarak yinelenmesi bekleniyor. Komutu çalıştırdığımda, tahminen Dürüstlük Hatası alıyorum ve hiçbir şey takılmıyor.Yalnızca benzersiz satırları SQLite (python) içine ekleme

Önceden bunları manuel olarak filtrelemek zorunda kalmadan, yalnızca çift satır olmayan satırları seçici olarak nasıl ekleyebilirim? Sadece Python'da bir hata istisnası oluşturabilir ve yinelenen satırı atlayabileceğinizi biliyorum. Bu kullanım durumunda yapabileceğim benzer bir şey var mı?

+0

yapabilirsiniz [EAFP] (http://docs.python.org/2/glossary.html#term-eafp) yerine satır satır eklemek için geri düşmek IntegrityError durumunda her parti, Bu parti için executemany; Yine, sadece EAFP her satır ve IntegrityError göz ardı. –

+0

Tamam, sanırım anlıyorum. Ben SQLite için yeniyim - ama bunu daha verimli hale getirmek için bir BEGIN/END işleminde sarmak istediğim bir şey mi? – ChrisArmstrong

cevap

17

Yinelenenleri yok saymak için INSERT OR IGNORE'u kullanmanız yeterlidir.

http://sqlite.org/lang_insert.html

+0

Teşekkürler! Bu benim için umuyordum çözüm oldu ... – ChrisArmstrong

+0

Bu harika bir cevap. – jdotjdot

+0

A 'çoğalt', birincil anahtarı başka bir satıra veya herhangi bir sütuna eşit olan bir satırdır? –

1

Bir seçenek, döngüyü executemany kullanmak yerine bir hata yakalayıcısı ile el ile yazmaktır.

Psuedocode:

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

Muhtemelen olarak executemany olabildiğince verimli ama muhtemelen dev INSERT SQL dizesi pregenerating size yer alacağı daha karmaşık SQL değişiklikleri içine alma hatası kısa yakalayacak.

İlgili konular