2012-12-01 85 views
7

我正在使用cursor.executemany将CSV文件中的批次行插入到SQLite表中,其中一些预计将基于主键字段进行重复。当我执行命令时,我可预见地得到一个完整性错误,没有任何东西被插入。在SQLite中插入唯一的行(python)

我该如何有选择地插入非重复行而不必提前手动过滤它们?我知道在纯Python中,您可以简单地创建一个错误异常并跳过重复行 - 是否有类似的东西可以在此用例中实现?

+0

您可以[EAFP(http://docs.python.org/2/glossary.html#term-eafp)每批在IntegrityError的情况下,你得回过头通过专线接入线路,而不是本批执行许可;再次,只是EAFP的每一行,并忽略IntegrityError。 –

+0

好的,我想我明白了。我是SQLite的新手 - 但是这是我想在BEGIN/END事务中包装以使其更有效吗? – ChrisArmstrong

回答

1

一种方法是简单地使用错误捕获手动写出循环,而不是使用executemany

伪代码:

for row in csvfile: 
    try: 
     cursor.execute('INSERT INTO X (Y) VALUES (%s)' % row[rowdatapoint]) 
    except IntegrityError: 
     pass 

大概不到预期的效果executemany,但它会抓住短暂进入,将可能涉及您预生成一个巨大的INSERT SQL字符串更复杂的SQL改变你的错误。