2013-05-15 13 views
9

Używam django + MySQL. Czasami wstawiam duplikaty danych do mojej bazy danych, co powoduje, że django podnosi IntegrityErrror.Django - Rozróżniaj różne typy IntegrityError

Problem polega na tym, że django/python używa tego samego błędu dla kilku różnych MySQL errors. Jedynym sposobem na rozróżnienie między nimi jest spojrzenie na kod błędu. Na przykład:

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

Moje pytanie brzmi: czy można to zrobić bezpiecznie? Jeśli tak, dlaczego nie jest to realizowane na niższym poziomie? Wygląda na to, że nie mogę być jedynym, który chce bardziej precyzyjnej kontroli nad IntegrityError.

Dzięki!

EDIT

Kod podnieść ten błąd

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

Czy możesz opublikować kod, który powoduje błąd integralności? –

+0

@ScottWoodall, dodano :) Nie jestem pewien, czy to będzie pomocne, jest to bardzo powszechny błąd w django (mnóstwo pytań na SO z pytaniem, dlaczego jest podnoszone) – djs22

+2

Nie jest to powód, dla którego te numery błędów są silnik zależny od bazy danych? –

Odpowiedz

3

Czy to bezpieczne?

To nie jest niebezpieczne. Mimo to stworzyłeś połączenie między aplikacją a bazą danych (MySQL). Co się stanie, jeśli zdecydujesz się na zamianę MySQL na inne rozwiązanie bazodanowe? Kody błędów zostaną zmienione, a kod wygeneruje niespójne wiadomości.

Jeśli tak, dlaczego nie jest to realizowane na niższym poziomie?

Prawdopodobnie dla tej samej troski, którą mam.

+1

wydaje mi się dziwne, że agnostyczna db ORM taka jak django nie mapuje tylko kodów błędów dla wielu baz danych. Zobacz rozmowę w komentarzach do pytania Andrew na temat tego – djs22

+0

Może to być praca odpowiednia dla rozszerzenia, a nie sama usługa ORM. Wykonanie tego, co proponujesz programistom ORM, wymaga dużego nakładu pracy przy bardzo niskim ROI. – rubayeet

Powiązane problemy