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...?