我cursor.executemany
用来将 CSV 文件中的成批行插入到 SQLite 表中,其中一些预计会根据主键字段重复。当我执行命令时,我可以预见地得到一个完整性错误并且没有插入任何内容。
如何有选择地只插入非重复行,而不必提前手动过滤掉它们?我知道在纯 Python 中你可以简单地创建一个错误异常并跳过重复的行——在这个用例中我可以实现类似的东西吗?
只需使用INSERT OR IGNORE
忽略重复项。
一种选择是简单地使用错误捕获手动写出循环,而不是使用executemany
.
伪代码:
for row in csvfile:
try:
cursor.execute('INSERT INTO X (Y) VALUES (%s)' % row[rowdatapoint])
except IntegrityError:
pass
可能不如 高效executemany
,但它会捕获您的错误,而不是进入更复杂的 SQL 更改,这可能涉及您预先生成一个巨大的INSERT
SQL 字符串。
在批量插入中有重复记录是一种痛苦,会导致整个批处理失败。然而ON CONFLICT
,作为子句扩展的INSERT
子句清除了重复记录的障碍。有多个 SQLite 子句可用于处理此类情况:
INSERT OR IGNORE
忽略重复记录
INSERT OR REPLACE
用最少的替换最新的重复记录
更多解释: