如何处理SQLITE错误,例如“没有列名为”,而不是作为异常引发?

时间:2016-04-23 21:26:38

标签: python sqlite

从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")

我能做些什么来捕捉类似的错误。

背景:我正在插入多行,如果插入查询不成功,我想在日志文件中突出显示。

谢谢你的建议

2 个答案:

答案 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    
相关问题