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

В проекте я начал с MySQL в качестве базы данных.Вместо того, чтобы сначала проверять, я просто делаю вставку, и если я получаю исключение IntegrityError с кодом 1062, я знаю, что есть дублирующаяся запись, и предупреждаю пользователя, чтобы сделать это и то.

, которое выглядит в основном какthis:

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

Ответы [ 2 ]

6 голосов
/ 05 января 2016

Кажется достаточно простым:

try:
    cursor.execute(query)
    conn.commit()
except MySQLdb.IntegrityError as e:
    if not e[0] == 1062:
        raise
    else:
        print "MY ERROR 1062: " + e[1]

Копаясь в файле соединений MySQLdb connections.py Я обнаружил, что он вызывает как errorclass, так и errorvalue.Таким образом, вы можете сделать так, чтобы ваш оператор try перехватил нужный класс, а затем использовал условия для обработки значения ошибки 1062, в противном случае продолжайте выдавать ошибку ..

connections.py

defaulterrorhandler(connection, cursor, errorclass, errorvalue):
    ....
    ....
    raise errorclass, errorvalue
3 голосов
/ 11 ноября 2011

То, что вы хотите найти, это то, что называется «SQLSTATE» - набор стандартных кодов ошибок, которые охватывают наиболее распространенные состояния ошибок СУБД.Они не обязательно предоставляют достаточно подробностей для всех целей, и я не знаю, поддерживает ли sqlite их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...