我正在使用cursor.executemany
插入来自CSV文件的一批行到SQLite表中,其中一些基于主键字段预计会是重复的。当我执行命令时,可预测地会出现完整性错误,并且没有插入任何内容。
如何有选择地只插入非重复行,而不必事先手动筛选它们?我知道在纯Python中,你可以简单地创建一个错误异常并跳过重复行 - 在这种情况下是否有类似的实现方法?
我正在使用cursor.executemany
插入来自CSV文件的一批行到SQLite表中,其中一些基于主键字段预计会是重复的。当我执行命令时,可预测地会出现完整性错误,并且没有插入任何内容。
如何有选择地只插入非重复行,而不必事先手动筛选它们?我知道在纯Python中,你可以简单地创建一个错误异常并跳过重复行 - 在这种情况下是否有类似的实现方法?
只需使用INSERT OR IGNORE
即可忽略重复数据。
ON CONFLICT
子句。 它是任何触发冲突的行,通常是由于UNIQUE
约束,但也可能是CHECK
或其他约束。 最常见的唯一约束是主键。 - schlenk一种选择是手动编写循环并添加错误捕获,而不是使用 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
用最小值替换最新的重复记录