10 Stimmen

Wie kann der Fehler 1062 "doppelter Eintrag" unabhängig von der verwendeten Datenbank/Engine abgefangen werden?

In einem Projekt habe ich mit MySQL als Datenbank begonnen. Anstatt zuerst zu prüfen, füge ich einfach etwas ein, und wenn ich eine IntegrityError-Ausnahme mit Code 1062 erhalte, weiß ich, dass es einen doppelten Eintrag gibt, und warne den Benutzer, dies und das zu tun.

die im Wesentlichen wie folgt aussieht:

try:
    # add duplicate, nothing bad happens yet, is only in sqla session
    db.session.add(User(email='already_used_email@address_that_has_to_be_unique.com'))
    # commit, now the IntegrityError is raised, when sqla inserts
    db.session.commit()
except IntegrityError as e:
    db.session.rollback()
    # this is what i do with mysql, check the exception for code 1062
    # how can i replace this with something db independent?
    code, msg = e.orig
    if code == 1062:
        # send warning
        pass

Nun, zum einen macht dies es bereits unmöglich, mit z. B. In-Memory-Sqlite zu testen. Nicht schön, aber ich könnte damit leben.

Zweitens könnte ich (muss/will ich aus anderen Gründen, die nichts mit dieser Frage zu tun haben) zu Postgres wechseln. Natürlich könnte ich den Code so ändern, dass er (auch) auf Postgres-Fehlercodes prüft, aber ich hatte gehofft, dass es eine Möglichkeit gibt, SQLALchemy sagen zu lassen, dass ein Duplikat unabhängig von der Datenbank aufgetreten ist. Eine Datenbank-Dialekt-Abstraktion...?

4voto

Richard Huxton Punkte 20050

Was Sie suchen wollen, ist etwas namens "SQLSTATE" - eine Reihe von Standardfehlercodes, die die meisten gängigen RDBMS-Fehlerzustände abdecken. Sie bieten jedoch nicht unbedingt genügend Details für alle Zwecke, und ich weiß nicht, ob Sqlite sie unterstützt.

0voto

devamos Punkte 1

Wenn Sie pymysql dann können Sie dies tun.

except pymysql.err.IntegrityError:
        db_connection.rollback() # rollback
        return jsonify({"message":"DUPLICATE"}), 400 # just json return

und dieser Link ist der Github-Code von pymysql.err. Sie können finden other exception von hier aus! https://github.com/PyMySQL/PyMySQL/blob/main/pymysql/err.py

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X