sqlite3 python 2.7如何从sqlite3启用更详细的错误报告(例外)?

时间:2016-07-19 15:48:54

标签: python-2.7 exception error-handling sqlite

我正在尝试使用executemany函数插入多行。我的完整代码最后给出了。

我得到的例外是

sqlite3.IntegrityError: column carname is not unique

我希望我能提供更详细的错误报告,提供导致错误的违规值。是否有可能从sqlite3获取更详细的错误报告(例外),以便它返回导致错误的违规值? 例如,在我的代码中,以下值是违规的:

(0, 'Audi', 52642),
(1, 'Audi', 52642),

carname应该是唯一的。

或者我是否必须逐个插入值并观察异常?

我的代码:基于this tutorial,我在列号carname上添加了UNIQUE约束。

import sqlite3 as lite
import sys

cars = (
    (0, 'Audi', 52642),
    (1, 'Audi', 52642),
    (2, 'Mercedes', 57127),
    (3, 'Skoda', 9000),
    (4, 'Volvo', 29000),
    (5, 'Bentley', 350000),
    (6, 'Hummer', 41400),
    (7, 'Volkswagen', 21600)
)

tblstr = """CREATE TABLE cars (
  carid integer PRIMARY KEY,
  carname NVARCHAR(50) UNIQUE,
  price integer NOT NULL
);"""


con = lite.connect('test.db')

with con:

    cur = con.cursor()    

    cur.execute("DROP TABLE IF EXISTS Cars")
    cur.execute(tblstr)
    cur.executemany("INSERT INTO Cars VALUES(?, ?, ?)", cars)

1 个答案:

答案 0 :(得分:1)

我认为,由于您已对其中一个列名称设置了唯一约束,除非您已经预先检查了数据,否则您不应使用executemany。 相反,请使用for ... loop循环数据,并在execute语句中使用try .. except进行每次更新。
这允许您列出任何错误,然后继续 例如:

with con:

    cur = con.cursor()

    cur.execute("DROP TABLE IF EXISTS Cars")
    cur.execute(tblstr)
    for x in cars:
        try:
            cur.execute("INSERT INTO Cars(carid,carname,price) VALUES(?, ?, ?)",(x[0],x[1],x[2]))
        except Exception as err:
            print err, x