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
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'")
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%Tags und Links exception sqlalchemy