2

特定の 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 制約。

  1. executemany() はループ内の INSERT と同じくらい高価ですか?
    @Unodeはそうではないと言っていますが、私の調査ではそうではありません。決定的な答えが欲しいです。
  2. これが最善の方法ですか、それとも大きなテーブルでは非常に遅くなるでしょうか?どうすれば確実にテストできますか?
4

1 に答える 1