2013-05-15 17 views
9

Sto usando django + MySQL. A volte, inserisco dati duplicati nel mio database, il che fa sì che django sollevi un IntegrityErrror.Django - Distingue i vari tipi di IntegrityError

Il problema è, django/python utilizzare questo stesso errore per diversi dei MySQL errors diversi. L'unico modo per distinguere tra loro è quello di guardare il codice di errore. Ad esempio,

try: 
    # code that raises integrity error 
except IntegrityError 
    if e.args[0] == 1062: 
     raise CustomCreatedDuplicateEntryError 
    else: 
     raise e 

La mia domanda è: è sicuro farlo? In tal caso, perché non è implementato a un livello inferiore? Sembra che non possa essere l'unico a desiderare un controllo più accurato su IntegrityError.

Grazie!

EDIT

Codice per alzare questo errore

class Foo(django.db.models.Model): 
    guid = models.CharField(max_length=32, db_index=True, unique=True) 

Foo(guid=a).save() 
# this raises an IntegrityError with code 1062! 
Foo(guid=a).save() 
+0

È possibile pubblicare il codice che genera l'errore di integrità? –

+0

@ScottWoodall, aggiunto :) Non sono sicuro che questo sia utile, si tratta di un errore molto comune in django (un sacco di domande su SO che chiede perché viene sollevato) – djs22

+2

Non è il motivo per cui quei numeri di errore sono database dipendente dal motore? –

risposta

3

Questa funzione è sicura di fare?

Questo non è pericoloso. Anche se in questo modo hai creato un accoppiamento tra l'applicazione e il database (MySQL). Cosa succede se decidi di sostituire MySQL con qualche altra soluzione di database? I codici di errore verranno modificati e il tuo codice genererà messaggi incoerenti.

Se sì, perché non è implementato a un livello inferiore?

Probabilmente per la stessa preoccupazione che sto avendo.

+1

mi sembra strano che un ORM agnostico db come django non si limita a mappare i codici di errore per più database. Guarda la conversazione nei commenti sulla domanda per Andrew's take su questo – djs22

+0

Potrebbe essere il lavoro adatto per un'estensione, non l'ORM stesso. Richiede molto sforzo per fare ciò che stai suggerendo agli sviluppatori di ORM, con un ROI molto basso. – rubayeet

Problemi correlati