我正在使用cursor.executemany
将CSV文件中的批量行插入到SQLite表中,其中一些表预计会基于主键字段重复。当我执行命令时,我可以预测得到完整性错误并且没有插入任何内容。
如何选择性地仅插入非重复行而不必提前手动过滤掉它们?我知道在纯Python中你可以简单地创建一个错误异常并跳过重复的行 - 我可以在这个用例中实现类似的东西吗?
答案 0 :(得分:22)
只需使用INSERT OR IGNORE
忽略重复项。
答案 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
替换最少的最新重复记录
更多说明: