In pysqlite, la violazione di un vincolo NOT NULL
o UNIQUE
genera anche un'eccezione Integrity. Sfortunatamente, questo tipo di eccezione non fornisce un codice di errore, ma solo un messaggio.IntegrityError di pysqlite: distinguere 'NOT NULL' dalla violazione 'UNIQUE'
Quindi, supponiamo di voler ignorare le violazioni dei vincoli univoci, perché so che questo è sicuro sui dati dati, ma i valori Null nelle colonne chiave devono essere segnalati.
mi è venuta in mente la seguente soluzione:
con = sqlite3.connect(':MEMORY:')
con.execute('''CREATE TABLE ABCD (A TEXT NOT NULL,
B TEXT NOT NULL,
C TEXT NOT NULL,
D TEXT NOT NULL,
PRIMARY KEY (A, B))''')
with con:
for a, b, c, d in inputs:
try:
con.execute('INSERT INTO ABCD VALUES (?, ?, ?, ?)',
(a, b, c, d))
except sqlite3.IntegrityError as e:
# Skip 'not unique' errors, but raise others.
if not e.message.endswith('not unique'):
raise
con.close()
Tuttavia, l'analisi del messaggio di errore sembra sbagliato e potrebbe essere inaffidabile. C'è un modo migliore per farlo, magari usando anche con.executemany()
?
Non ho una risposta alla tua domanda. Ma mi chiedo a cosa serve un vincolo se può essere ignorato in sicurezza? Perché non lasciarlo? Nel tuo codice di esempio '(A, B)' sei PK. Penso che questo vincolo non debba essere ignorato. Quale sarebbe un caso d'uso del mondo reale? –
Il vincolo univoco non viene ignorato, le linee di input lo sono. Ci si aspetta che l'input contenga duplicati su quei campi, e sto saltando silenziosamente le ripetizioni. – lenz
È possibile filtrare l'input e rimuovere tutti i duplicati prima di passarlo a SQLite. –