13

cursor.executemany用来将 CSV 文件中的成批行插入到 SQLite 表中,其中一些预计会根据主键字段重复。当我执行命令时,我可以预见地得到一个完整性错误并且没有插入任何内容。

如何有选择地只插入非重复行,而不必提前手动过滤掉它们?我知道在纯 Python 中你可以简单地创建一个错误异常并跳过重复的行——在这个用例中我可以实现类似的东西吗?

4

3 回答 3

27

只需使用INSERT OR IGNORE忽略重复项。

http://sqlite.org/lang_insert.html

于 2012-12-01T22:02:34.893 回答
4

一种选择是简单地使用错误捕获手动写出循环,而不是使用executemany.

伪代码:

for row in csvfile:
   try:
       cursor.execute('INSERT INTO X (Y) VALUES (%s)' % row[rowdatapoint])
   except IntegrityError:
       pass

可能不如 高效executemany,但它会捕获您的错误,而不是进入更复杂的 SQL 更改,这可能涉及您预先生成一个巨大的INSERTSQL 字符串。

于 2012-12-01T20:53:42.863 回答
2

在批量插入中有重复记录是一种痛苦,会导致整个批处理失败。然而ON CONFLICT,作为子句扩展的INSERT子句清除了重复记录的障碍。有多个 SQLite 子句可用于处理此类情况:

INSERT OR IGNORE 忽略重复记录

INSERT OR REPLACE 用最少的替换最新的重复记录

更多解释:

  1. https://sqlite.org/lang_conflict.html
  2. https://sqlite.org/lang_insert.html
于 2019-08-02T12:35:25.023 回答