从Python中的SQLite数据库中捕获“错误”的最佳方法是什么,因为它们在Python中不被视为异常。
我在尝试INSERT或IGNORE语句后输出错误,其中DB中不存在列,如下所示
('table X has no column named Y,)
以下语句用于执行查询
cursor.execute("INSERT...")
我想到的方法,当光标/查询出错时不返回rowcount
if cursor.rowcount != 1:
print("##########Error write_DB\n")
我能做些什么来捕捉类似的错误。
背景:我正在插入多行,如果插入查询不成功,我想在日志文件中突出显示。
谢谢你的建议
答案 0 :(得分:2)
您可以关注EAFP approach,使用常规INSERT
(不使用"忽略"部分)并捕获可以记录的数据库错误:
try:
cursor.execute("INSERT INTO ...", params)
except sqlite3.Error as err:
logger.error(err.message)
答案 1 :(得分:1)
您可以使用ON CONFLICT clause
子句。这将是SQL状态的一部分,让您有机会覆盖CREATE
等语句中的错误。
对于INSERT,实际语法为INSERT OR IGNORE
而不是INSERT
,其他选项如abort或rollback也可以在该链接中找到。
[编辑]
我还附上了一个错误示例,其中显示了alecxe以下答案的可行性。他的回答似乎是更好的方法:
import sqlite3 as lite
con = lite.connect('test.db')
with con:
cur = con.cursor()
cur.execute("CREATE TABLE Persons(Id INT, Name TEXT)")
cur.execute("INSERT INTO Persons VALUES(1,'Joe')")
cur.execute("INSERT INTO Persons VALUES(1,'Jenny')")
try:
cur.execute("INSERT INTO Persons VALUES(1,'Jenny', 'Error')")
self.con.commit()
except lite.Error as er:
print 'er:', er.message
#Retrieve data
cur.execute("SELECT * FROM Persons")
rows = cur.fetchall()
for row in rows:
print row