2012-12-01 18 views
7

私はcursor.executemanyを使用して、CSVファイルからSQLiteテーブルに行のバッチを挿入します。その一部はプライマリキーフィールドに基づいて重複が予想されます。コマンドを実行すると、予期せず完全性エラーが発生し、何も挿入されません。SQLite(Python)にユニークな行だけを挿入する

事前に手作業でフィルタリングすることなく、重複しない行だけを選択して挿入するにはどうすればよいですか?純粋なPythonで、エラー例外を作成して重複行をスキップすることができます。このユースケースで実装できるものは何ですか?

+0

することはでき[EAFP](http://docs.python.org/2/glossary.html#term-eafp)あなたが代わりに行で行を挿入するためにフォールバックIntegrityErrorの場合の各バッチ、このバッチのexecutemanyのEAFPはそれぞれの行だけで、IntegrityErrorは無視されます。 –

+0

さて、私は理解していると思います。私はSQLiteを初めて使っていますが、これをより効率的にするためにBEGIN/ENDトランザクションで折り返したいと思っていますか? – ChrisArmstrong

答えて

17

INSERT OR IGNOREを使用して重複を無視してください。

http://sqlite.org/lang_insert.html

+0

ありがとう!これは私が望んでいた解決策でした... – ChrisArmstrong

+0

これはすばらしい答えです。 – jdotjdot

+0

'duplicate'はその主キーが別の行または任意の列に等しい行ですか? –

1

1つのオプションは、executemanyではなく、エラーキャッチを使用して手動でループを書き出すことです。

擬似コード:executemanyとして

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

おそらくとして効率的ではありませんが、それはおそらく巨大なINSERT SQL文字列をpregeneratingあなたを伴うだろう、より複雑なSQLの変更に入るの短いあなたのエラーをキャッチします。

関連する問題