【问题标题】:sqlite3 python 2.7 how to enable more detailed error reporting (exceptions) from sqlite3?sqlite3 python 2.7 如何从 sqlite3 启用更详细的错误报告(异常)?
【发布时间】:2016-11-22 14:58:17
【问题描述】:

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

【问题讨论】:

    标签: python-2.7 exception error-handling sqlite


    【解决方案1】:

    我认为,由于您对其中一个列名设置了唯一约束,除非您预先审查了数据,否则您不应该使用 executemany
    相反,使用for ... loop 循环数据并在try .. except 语句中为每次更新使用execute
    这使您可以列出所有错误并继续。
    例如:

    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
    

    【讨论】:

      猜你喜欢
      • 2019-09-17
      • 2018-01-06
      • 1970-01-01
      • 1970-01-01
      • 2014-11-08
      • 2013-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多