2012-12-01 13 views
7

Sto utilizzando cursor.executemany per inserire batch di file da file CSV in una tabella SQLite, alcuni dei quali dovrebbero essere duplicati in base al campo chiave primaria. Quando eseguo il comando, ottengo prevedibilmente un errore di integrità e non viene inserito nulla.Inserimento di sole righe univoche in SQLite (python)

Come inserire selettivamente solo le righe non duplicate senza doverle filtrare manualmente prima del tempo? So che solo in Python puoi semplicemente creare un'eccezione di errore e saltare la riga duplicata - c'è qualcosa di simile che posso implementare in questo caso d'uso?

+0

È possibile [EAFP] (http://docs.python.org/2/glossary.html#term-eafp) ogni partita, in caso di IntegrityError si cade di nuovo per inserire riga per riga, invece di executemany per questo lotto; di nuovo, basta assegnare a EAFP ciascuna riga e ignorare IntegrityError. –

+0

Ok, penso di aver capito. Sono nuovo di SQLite - ma è qualcosa che vorrei racchiudere in una transazione BEGIN/END per renderlo più efficiente? – ChrisArmstrong

risposta

17

Utilizzare semplicemente INSERT OR IGNORE per ignorare i duplicati.

http://sqlite.org/lang_insert.html

+0

Grazie! Questa era la soluzione che speravo ... – ChrisArmstrong

+0

Questa è un'ottima risposta. – jdotjdot

+0

Un 'duplicato' è una riga con la sua chiave primaria uguale a un'altra riga o qualsiasi colonna? –

1

Un'opzione è semplicemente scrivere manualmente il ciclo con un errore anziché utilizzare executemany.

psuedocodarlo:

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

Probabilmente non così efficiente come executemany, ma sarà cattura l'errore di entrare in breve modifiche SQL più complicati che possibilmente coinvolgere pregenerating una stringa INSERT SQL gigante.

Problemi correlati