MySQLdb Python防止重复并优化多个插入

时间:2012-10-23 04:34:56

标签: python mysql

我编写了这个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增加重复值并插入它。

  1. executemany()和循环中的INSERT一样昂贵吗? @Unode说它不是,但我的研究告诉了我。我想要一个明确的答案。
  2. 这是最好的方式还是会变得非常慢而且更大 表格以及我如何测试以确定?

1 个答案:

答案 0 :(得分:2)

1 - 防止重复插入的最佳方法是什么?

根据您的情况中“预防”的含义,您有两种策略和一种要求。

要求是在要使其唯一的列/列上添加UNIQUE约束。如果尝试插入重复条目,这将导致错误。但是,如果您使用executemany,结果可能不是您所期望的。

然后作为策略你可以做:

  • 之前运行SELECT语句的初始过滤步骤。这意味着在行中每个项目运行一个SELECT语句以检查它是否已存在。这种策略有效,但效率低下。

  • 使用ON DUPLICATE KEY UPDATE。如果数据已存在,则会自动触发更新。有关更多信息,请参阅the official documentation

2 - executemany()和循环中的INSERT一样昂贵吗?

不,executemany创建一个查询,在执行for循环时批量插入将创建与rows中元素数量一样多的查询。