使用executemany进行SQLite插入时如何忽略错误?

时间:2015-01-13 22:46:02

标签: python sqlite

我使用Python的sqlite3模块将~500k项目插入sqlite数据库并执行许多项目,对插入内容进行分块:

    c = self.conn.cursor()
    for chunk in (values[i:i+CHUNK_SIZE] for i in xrange(0, len(values), CHUNK_SIZE)):
        data = ((x[0], x[1].decode('utf-8', 'ignore')) for x in chunk)
        try:
            c.executemany('INSERT INTO posts VALUES (?,?)', data )
            self.conn.commit()
        except Exception, e:
            print "EXCEPTION:", e, data

数据不在我的控制范围内,有时包含错误的编码,导致executemany出错:

You must not use 8-bit bytestrings unless you use a text_factory that can 
interpret 8-bit bytestrings (like text_factory = str). It is highly recommended 
that you instead just switch your application to Unicode strings.

我尝试了各种解码文字的方法,但错误不断回来。

我想忽略这些错误,跳过带有编码问题的项目(或者将它们部分存储;并不是真的很重要),同时存储其余部分。

有没有办法告诉executemany在遇到错误时插入剩余的批处理时不会挽救? executemany忽略错误但存储其余项目?

1 个答案:

答案 0 :(得分:1)

对每个data过滤chunk似乎最简单;即,而不是:

data = ((x[0], x[1].decode('utf-8', 'ignore')) for x in chunk)

类似的东西:

data = []
for x in chunk:
    try: second = x[1].decode('utf-8')
    except UnicodeDecodeError: continue
    data.append((x[0], second))

当这个已清理的data传递给executemany时,这应该具有完全相同的效果 - 这样您就可以跳过编码问题的线条" (假设后者来自第二项;如果问题带有x[0]则需要进行检查)。