В проекте, который я начал с MySQL в качестве базы данных. Вместо того, чтобы сначала проверить, я просто делаю вставку, и если я получаю исключение IntegrityError с кодом 1062, я знаю, что есть повторяющаяся запись, и предупреждаю пользователя, чтобы он сделал то или это.
это выглядит примерно так:
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
Теперь, например, это уже делает невозможным тестирование, например. в памяти sqlite. Неприятно, но я мог бы с этим жить.
Во-вторых, однако, я мог бы (должен / хотел бы по другим вопросам, выходящим за рамки этого вопроса) переключиться на Postgres. Конечно, я мог бы просто изменить код, чтобы (также) проверять коды ошибок Postgres, но я надеялся, что есть способ заставить SQLALchemy сообщить мне, что дубликат произошел независимо от базы данных. Абстракция диалекта базы данных ...?