仅将唯一行插入SQLite(python)

仅将唯一行插入SQLite(python),python,sqlite,Python,Sqlite,我正在使用cursor.executemany将CSV文件中的成批行插入到SQLite表中,其中一些行根据主键字段预期是重复的。当我执行该命令时,可以预见会出现完整性错误,并且不会插入任何内容 如何有选择地只插入不重复的行,而不必提前手动筛选它们?我知道,在纯Python中,您可以简单地创建一个错误异常并跳过重复的行——在这个用例中我可以实现类似的功能吗?一个选项是使用错误捕获手动编写循环,而不是使用executemany 伪代码: for row in csvfile: try:

我正在使用cursor.executemany将CSV文件中的成批行插入到SQLite表中,其中一些行根据主键字段预期是重复的。当我执行该命令时,可以预见会出现完整性错误,并且不会插入任何内容


如何有选择地只插入不重复的行,而不必提前手动筛选它们?我知道,在纯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
    子句。它是触发冲突的任何行,通常是由于
    唯一
    约束引起的,但也可能是
    检查
    或其他约束。最常见的唯一约束是主键。