在python中,我使用importmany填充SQLITE数据库,因此我可以一次导入数万行数据.我的数据包含在元组列表中.我的数据库设置了我想要的主键.
我遇到的问题是主键错误会引发IntegrityError.如果我处理异常,我的脚本会在主键冲突时停止导入.
尝试:
try:
self.curs.executemany("INSERT into towers values (NULL,?,?,?,?)",self.insertList)
except IntegrityError:
print "Primary key error"
conn.commit()
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,在python中使用importmany可以:
1.捕获违反主键的值?
2.收到主键错误后继续加载数据.
我明白为什么它不会继续加载,因为在异常之后我将数据提交到数据库.我不知道如何继续我离开的地方.
Unforutnley我无法复制并粘贴此网络上的所有代码,任何帮助将不胜感激.现在我没有设置PK作为解决方法......
首先回答(2),如果你想在出现错误后继续加载,那么在 SQL 端进行简单的修复即可:
INSERT OR IGNORE INTO towers VALUES (NULL,?,?,?,?)
Run Code Online (Sandbox Code Playgroud)
这将成功插入任何没有任何违规的行,并优雅地忽略冲突。但请注意,如果IGNORE外键违规,该条款仍然会失败。
在您的情况下,冲突解决条款的另一个选项是:INSERT OR REPLACE INTO ...。我强烈推荐SQLite 文档以获取有关冲突和冲突解决的更多信息。
据我所知,你不能以有效的方式同时执行(1)和(2) 。您可以创建一个在插入之前触发的触发器,该触发器可以捕获冲突的行,但这会给所有插入带来很多不必要的开销。(如果您能以更聪明的方式做到这一点,请告诉我。)因此,我建议您考虑是否确实需要捕获冲突行的值,或者是否需要重新设计您的架构(如果可能/适用)。
小智 0
您可以使用以下lastrowid方法来获取停止点:
http://docs.python.org/library/sqlite3.html#sqlite3.Cursor.lastrowid
但是,如果您使用它,则无法使用executemany.