我正在尝试使用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)
答案 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