IntegrityE后继续加载

2024-09-30 01:20:09 发布

您现在位置:Python中文网/ 问答频道 /正文

在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设置为工作。。。在


Tags: 数据self脚本数据库列表sqlite错误元组
3条回答

首先要回答(2),如果您希望在出现错误后继续加载,那么在SQL端这是一个简单的修复:

INSERT OR IGNORE INTO towers VALUES (NULL,?,?,?,?)

这将成功地插入没有任何冲突的行,并优雅地忽略冲突。但是请注意,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循环。像这样:

for it in self.insertList:
    try:
        self.curs.execute("INSERT into towers values (NULL,?,?,?,?)",it)
    except IntegrityError:
        #here you could insert the itens that were rejected in a temporary table
        #without constraints for later use (question 1)
        pass
conn.commit()

你甚至可以计算出列表中有多少项是真正插入的。在

相关问题 更多 >

    热门问题