在python中,我使用importmany填充SQLITE数据库,因此我可以一次导入数万行数据。我的数据包含在元组列表中。我用我想要的主键建立了数据库。在
我遇到的问题是主键错误会引发IntegrityError。如果我处理异常,我的脚本在主键冲突时停止导入。
尝试:
try:
self.curs.executemany("INSERT into towers values (NULL,?,?,?,?)",self.insertList)
except IntegrityError:
print "Primary key error"
conn.commit()
所以我的问题是,在python中使用importmany可以:
1捕获违反主键的值?
2收到主键错误后继续加载数据。
我明白为什么它不继续加载,因为在异常之后,我将数据提交到数据库。但是,我不知道如何继续我离开的地方。
但我不能复制和粘贴这个网络上的所有代码,任何帮助将不胜感激。现在我还没有把PKs设置为工作。。。在
首先要回答(2),如果您希望在出现错误后继续加载,那么在SQL端这是一个简单的修复:
这将成功地插入没有任何冲突的行,并优雅地忽略冲突。但是请注意,
IGNORE
子句在外键冲突时仍然会失败。在在您的例子中,冲突解决子句的另一个选项是:
INSERT OR REPLACE INTO ...
。我强烈建议使用SQLite docs获取有关冲突和冲突解决的更多信息。在据我所知,你不能用一种有效的方法同时做(1)和(2)。您可以创建一个触发器,在插入之前激发它,它可以捕获冲突的行,但这会给所有插入带来很多不必要的开销。(如果你能用一种更聪明的方式来做这件事,请有人告诉我。)因此,我建议你考虑是否真的需要捕获冲突行的值,或者是否需要重新设计架构(如果可能/适用)。在
您可以使用
lastrowid
来获得停止点:http://docs.python.org/library/sqlite3.html#sqlite3.Cursor.lastrowid
但是,如果使用它,则不能使用
executemany
。在使用for循环遍历列表并使用execute而不是executemany。用try-and-continue执行异常后的for循环。像这样:
你甚至可以计算出列表中有多少项是真正插入的。在
相关问题 更多 >
编程相关推荐