特定の xls ファイルを mysql にインポートするために、この python スクリプトを作成しました。正常に動作しますが、同じデータに対して 2 回実行すると、エントリが重複して作成されます。MySQLを使用する必要があると確信していますJOIN
が、その方法が明確ではありません。また、executemany() は、ループ内で挿入を行うのと同じオーバーヘッドが発生しますか? 私は明らかにそれを避けようとしています。
これが問題のコードです...
for row in range(sheet.nrows):
"""name is in the 0th col. email is the 4th col."""
name = sheet.cell(row, 0).value
email = sheet.cell(row, 4).value
if name and email:
mailing_list[name.lstrip()] = email.strip()
for n, e in sorted(mailing_list.iteritems()):
rows.append((n, e))
db = MySQLdb.connect(host=host, user=user, db=dbname, passwd=pwd)
cursor = db.cursor()
cursor.executemany("""
INSERT IGNORE INTO mailing_list (name, email) VALUES (%s,%s)""",(rows))
明確化...
私はここでそれを読んだ...
確かに、executemany() は事実上単純な反復と同じです。ただし、通常は高速です。これは、複数の行にわたって INSERT および REPLACE に影響を与える最適化された手段を提供します。
また、私は Unodes の提案を取り入れ、UNIQUE 制約を使用しました。しかし、IGNORE
キーワードは、ON DUPLICATE KEY UPDATE
黙って失敗したいという理由よりも優れています。
TL;DR
1. 重複挿入を防ぐ最善の方法は何ですか?
回答 1SELECT IGNORE
:サイレントに失敗するかON DUPLICATE KEY UPDATE
、重複する値をインクリメントして挿入する列の UNIQUE 制約。
- executemany() はループ内の INSERT と同じくらい高価ですか?
@Unodeはそうではないと言っていますが、私の調査ではそうではありません。決定的な答えが欲しいです。 - これが最善の方法ですか、それとも大きなテーブルでは非常に遅くなるでしょうか?どうすれば確実にテストできますか?