Как отловить ошибку 1062 «повторяющаяся запись» независимо от используемой базы данных / движка?

В проекте, который я начал с 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 сообщить мне, что дубликат произошел независимо от базы данных. Абстракция диалекта базы данных ...?

9
задан Mark Amery 16 September 2018 в 18:34
поделиться