2016-07-19 69 views
1

我正試圖用executemany函數插入多行。我的完整代碼在最後給出。sqlite3 python 2.7如何從sqlite3啓用更詳細的錯誤報告(例外)?

我得到的例外是

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

我認爲,既然你已經放置在列名的一個唯一約束,除非你已經預先審覈,你不應該使用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