我使用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忽略错误但存储其余项目?
答案 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]
则需要进行检查)。