2016-07-19 18 views
1

Ich versuche, mehrere Zeilen mit der executemany-Funktion einzufügen. Mein vollständiger Code wird am Ende gegeben.sqlite3 python 2.7 Wie kann man detailliertere Fehlerberichte (Ausnahmen) von sqlite3 aktivieren?

Die Ausnahme, die ich bekommen ist

sqlite3.IntegrityError: column carname is not unique 

Ich wünschte, ich könnte eine detailliertere Fehlermeldung, die beanstandeten Werte geben, die den Fehler verursacht hat. Ist es möglich, einen detaillierteren Fehlerbericht (in einer Ausnahme) von sqlite3 zu erhalten, damit er die fehlerhaften Werte zurückgibt, die den Fehler verursacht haben? Zum Beispiel in meinem Code, die folgenden Werte sind säumige:

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

Die carname sollte eindeutig sein.

Oder muss ich die Werte nur eins nach dem anderen eingeben und die Ausnahmen beachten?

Mein Code: basierend auf this tutorial, habe ich die UNIQUE Einschränkung für die Spalte Carname hinzugefügt.

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) 

Antwort

1

Ich würde argumentieren, dass da Sie eine eindeutige Einschränkung auf einen der Spaltennamen gesetzt haben, wenn Sie die Daten-geprüft vorge haben, sollten Sie nicht executemany werden.
Verwenden Sie stattdessen eine for ... loop Schleife über die Daten und verwenden Sie eine execute innerhalb einer try .. except Anweisung für jedes Update.
Damit können Sie Fehler auflisten und trotzdem fortfahren.
Zum Beispiel:

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