仅将唯一行插入SQLite(python)
我正在使用cursor.executemany将CSV文件中的成批行插入到SQLite表中,其中一些行根据主键字段预期是重复的。当我执行该命令时,可以预见会出现完整性错误,并且不会插入任何内容仅将唯一行插入SQLite(python),python,sqlite,Python,Sqlite,我正在使用cursor.executemany将CSV文件中的成批行插入到SQLite表中,其中一些行根据主键字段预期是重复的。当我执行该命令时,可以预见会出现完整性错误,并且不会插入任何内容 如何有选择地只插入不重复的行,而不必提前手动筛选它们?我知道,在纯Python中,您可以简单地创建一个错误异常并跳过重复的行——在这个用例中我可以实现类似的功能吗?一个选项是使用错误捕获手动编写循环,而不是使用executemany 伪代码: for row in csvfile: try:
如何有选择地只插入不重复的行,而不必提前手动筛选它们?我知道,在纯Python中,您可以简单地创建一个错误异常并跳过重复的行——在这个用例中我可以实现类似的功能吗?一个选项是使用错误捕获手动编写循环,而不是使用
executemany
伪代码:
for row in csvfile:
try:
cursor.execute('INSERT INTO X (Y) VALUES (%s)' % row[rowdatapoint])
except IntegrityError:
pass
可能没有
executemany
那么有效,但它会捕获错误,而不会进行更复杂的SQL更改,这可能会涉及预生成一个巨大的INSERT
SQL字符串。只需使用INSERT或IGNORE
忽略重复项即可
批量插入重复记录是一种痛苦,它会导致完整批次的失败。然而,
ON CONFLICT
子句是INSERT
子句的扩展,它清除了重复记录的障碍。有多个SQLite子句可用于处理此类情况:
插入或忽略
忽略重复记录
插入或替换
将最新的重复记录替换为最少的重复记录
更多说明:
您可以在每个批中插入,如果是IntegrityRor,您可以回退到逐行插入,而不是该批的ExecuteMy;再一次,只需每行一次,忽略整数错误。好的,我想我明白了。我是SQLite新手——但这是否是我想要在BEGIN/END事务中包装以提高效率的东西呢?
duplicate
是主键等于另一行或任何列的行?请参阅SQLite文档中的ON CONFLICT
子句。它是触发冲突的任何行,通常是由于唯一
约束引起的,但也可能是检查
或其他约束。最常见的唯一约束是主键。