我编写了这个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))
我读了here ......
可以肯定的是,executemany()实际上与简单迭代相同。 但是,它通常更快。它提供了一种优化的手段 影响多行的INSERT和REPLACE。
我还采用了Unodes建议并使用了UNIQUE约束。但IGNORE
关键字优于ON DUPLICATE KEY UPDATE
,因为我希望它能够无声地失败。
TL; DR
<击> 1。防止重复插入的最佳方法是什么?
答案1 :SELECT IGNORE
列上的UNIQUE禁令无声地失败或ON DUPLICATE KEY UPDATE
增加重复值并插入它。
答案 0 :(得分:2)
1 - 防止重复插入的最佳方法是什么?
根据您的情况中“预防”的含义,您有两种策略和一种要求。
要求是在要使其唯一的列/列上添加UNIQUE
约束。如果尝试插入重复条目,这将导致错误。但是,如果您使用executemany
,结果可能不是您所期望的。
然后作为策略你可以做:
之前运行SELECT
语句的初始过滤步骤。这意味着在行中每个项目运行一个SELECT语句以检查它是否已存在。这种策略有效,但效率低下。
使用ON DUPLICATE KEY UPDATE
。如果数据已存在,则会自动触发更新。有关更多信息,请参阅the official documentation。
2 - executemany()和循环中的INSERT一样昂贵吗?
不,executemany
创建一个查询,在执行for循环时批量插入将创建与rows
中元素数量一样多的查询。