2

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

  1. executemany() 是否与循环中的 INSERT 一样昂贵?
    @Unode 说不是,但我的研究告诉我不然。我想要一个确定的答案。
  2. 这是最好的方法还是对于更大的桌子真的很慢,我将如何测试来确定?
4

1 回答 1

2

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

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

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

然后作为策略,您可以执行以下操作:

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

  • 使用ON DUPLICATE KEY UPDATE. 如果数据已经存在,这会自动触发更新。更多信息请参考官方文档

2 - executemany() 是否与循环中的 INSERT 一样昂贵?

不,executemany创建一个在执行 for 循环时批量插入的查询将创建与rows.

于 2012-10-23T12:30:12.280 回答