只在SQLite中插入唯一的行(python)

时间:2012-12-01 19:58:51

标签: python sqlite

我正在使用cursor.executemany将CSV文件中的批量行插入到SQLite表中,其中一些表预计会基于主键字段重复。当我执行命令时,我可以预测得到完整性错误并且没有插入任何内容。

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

3 个答案:

答案 0 :(得分:22)

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

http://sqlite.org/lang_insert.html

答案 1 :(得分:1)

一个选项是简单地使用错误捕获而不是使用executemany来手动写出循环。

伪码:

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

可能效率不如executemany,但是它会捕获您的错误,而不会进入更复杂的SQL更改,这可能会导致您生成巨大的INSERT SQL字符串。

答案 2 :(得分:0)

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

INSERT OR IGNORE 忽略重复记录

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

更多说明:

  1. https://sqlite.org/lang_conflict.html
  2. https://sqlite.org/lang_insert.html