我编写了这个 python 脚本来将特定的 xls 文件导入 mysql。它工作正常,但如果它在相同的数据上运行两次,它将创建重复的条目。我很确定我需要使用 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;博士
1.防止重复插入的最佳方法是什么?
答案 1: 列上的唯一约束SELECT IGNORE
以静默方式失败或ON DUPLICATE KEY UPDATE
增加重复值并插入它。
- executemany() 是否与循环中的 INSERT 一样昂贵?
@Unode 说不是,但我的研究告诉我不然。我想要一个确定的答案。 - 这是最好的方法还是对于更大的桌子真的很慢,我将如何测试来确定?