SQLAlchemy Fehlerbehandlung - wie wird es gemacht?

8

Ich möchte einen Fall behandeln, bei dem es einen Primärschlüssel oder einen eindeutigen Schlüsselkonflikt gibt, auch bekannt als Duplikateintrag. Dafür fange ich die IntegrityError , die den Fehler gut fängt. Das Problem ist, ich kann anscheinend keine einfache Fehlermeldung oder einen Fehlercode finden, nach dem zu suchen ist. Alles, was ich bekomme, ist die Eigenschaft IntegrityError.message , die eine Zeichenfolge ist, die wie folgt aussieht:

  

(IntegrityError) (1062, "Doppeleintrag 'foobar' für Schlüssel 'name'")

Das ist nicht sehr hilfreich. Mit dem werde ich anfangen, Fehlermeldungen für ihren Code und ihre Nachricht zu analysieren. Der Aufruf von dir für die Ausnahme zeigt nur die folgenden Eigenschaften:

  

'args', 'connection_invalidated', 'Instanz', 'Nachricht', 'orig', 'params', 'Anweisung'

args ist einfach ein Einzeltupetupel mit der oben erwähnten Zeichenkette darin und params sind die Daten, die ich versuchte einzufügen. Ich kann anscheinend keine Möglichkeit finden, zu bestimmen, dass dies tatsächlich ein doppelter Schlüsselfehler ist, ohne tatsächlich die Fehlermeldung mit regex oder etwas zu analysieren.

Kann jemand etwas zu diesem Thema sagen?

Danke

    
Hubro 26.07.2012, 04:13
quelle

2 Antworten

12

Ich habe das beim Schreiben der Frage herausgefunden, indem ich die Dokumentation genauer gelesen habe. Ich werde das immer noch posten, da es für jemanden hilfreich sein könnte.

In der Dokumentation der SQLAlchemy DBAPIError , von der die IntegrityError ist unterklassifiziert und erklärt, dass die Ausnahme lediglich ein Wrapper für ist Der zugrunde liegende Datenbank-API-Fehler und der ursprüngliche Fehler wird als orig in der Ausnahme gespeichert. Sicher genug, Aufruf von e.orig.args Ich bekomme ein gut organisiertes Tupel:

  

(1062, "Doppeleintrag 'foobar' für Schlüssel 'name'")

    
Hubro 26.07.2012, 04:13
quelle
0

Soweit ich weiß, besteht die einzige Möglichkeit darin, die Fehlerzeichenfolge in der Ausnahme zu analysieren. Ich kann kein Tupel finden, das den Fehler angibt, die Spalte mit der verletzten Eindeutigkeitsbedingung und dem Wert getrennt.

Insbesondere kann die Ausnahmebedingungsnachricht mit einem Teilstringsuchoperator oder einem regulären Ausdruck gesucht werden. Zum Beispiel:

%Vor%

Diese Strings können jedoch sehr lang sein, weil die SQL-Anweisung enthalten ist, zum Beispiel:

%Vor%

Damit minimieren Sie die Fehlerbehandlung bei der Analyse von Ausnahmen, wenn Sie die Datenbankfehlermeldung ohne die hinzugefügten Informationen von sqlalchemy durchsuchen. Dies kann durch die Untersuchung von err.args geschehen, die kleiner sein sollten:

%Vor%

Das aktualisierte Beispiel:

%Vor%

Beachten Sie, dass die hier verwendete Fehlersyntax für sqlite3 gilt. Eine mysql-Ausnahmefehlermeldung wie:

parsen %Vor%

Kann mit einem geeigneten regulären Ausdruck ausgeführt werden. Beachten Sie, dass es wie ein Tupel aussieht, aber es ist tatsächlich eine Zeichenkette (sqlalchemy Version 1.1.3 und mysql 5.5).

Zum Beispiel:

%Vor%     
Angelos 13.12.2016 11:24
quelle

Tags und Links