Сообщить об ошибке.

Исключения, определяемые модулем MySQLdb в Python

Перехват ошибок при работе с модулем MySQLdb

Модуль MySQLdb делает всю информацию об ошибках доступной через представленные в этом материале исключения и их подклассы. Встроенные исключения MySQLdb дают пользователю довольно хорошее представление о том, что пошло не так.

Схема иерархии/наследования исключений:

MySQLdb.Exception
|__MySQLdb.MySQLError
   |__MySQLdb.Warning
   |__MySQLdb.Error
      |__MySQLdb.InterfaceError
      |__MySQLdb.DatabaseError
         |__MySQLdb.DataError
         |__MySQLdb.OperationalError
         |__MySQLdb.IntegrityError
         |__MySQLdb.InternalError
         |__MySQLdb.ProgrammingError
         |__MySQLdb.NotSupportedError

Описание исключений модуля MySQLdb:


MySQLdb.DataError:

Исключение MySQLdb.DataError возникает для ошибок, вызванных проблемами обработки данных, такими как деление на ноль, числовое значение вне диапазона и т.д.

MySQLdb.DatabaseError:

Исключение MySQLdb.DatabaseError возникает для ошибок, связанных с базой данных.

MySQLdb.Error:

Исключение MySQLdb.Error является базовым классом всех других исключений (кроме MySQLdb.Warning).

MySQLdb.IntegrityError:

Исключение MySQLdb.IntegrityError возникает, когда нарушается реляционная целостность базы данных, например, сбой проверки внешнего ключа, дубликат ключа и т.д.

MySQLdb.InterfaceError:

Исключение MySQLdb.InterfaceError вызывается для ошибок, связанных с интерфейсом базы данных, а не с самой базой данных.

MySQLdb.InternalError:

Исключение MySQLdb.InternalError возникает, когда база данных сталкивается с внутренней ошибкой, например, курсор больше недействителен, транзакция не синхронизирована и т.д.

MySQLdb.MySQLError:

Исключение MySQLdb.MySQLError вызывается для ошибок, связанных с работой с MySQL..

MySQLdb.NotSupportedError:

Исключение MySQLdb.NotSupportedError возникает в случае, если использовался метод или API базы данных, который не поддерживается базой данных, например, запрос connect.rollback() для соединения, которое не поддерживает транзакцию или транзакции отключены.

MySQLdb.OperationalError:

Исключение MySQLdb.OperationalError вызывается для ошибок, которые связаны с работой базы данных и не обязательно находятся под контролем программиста, например, происходит неожиданное отключение, имя источника данных, транзакция не может быть обработана, произошла ошибка выделения памяти во время обработки и т.д.

MySQLdb.ProgrammingError:

Исключение MySQLdb.ProgrammingError возникает из-за ошибок программирования, например, таблица не найдена или уже существует, синтаксическая ошибка в инструкции SQL, неправильное количество заданных параметров и т.д.

MySQLdb.Warning:

Исключение MySQLdb.Warning вызывается для важных предупреждений, таких как усечение данных при вставке и т.д.

Пример перехвата ошибок с MySQLdb.

from contextlib import closing
from MySQLdb import (
        connect, cursors, 
        Error, IntegrityError, 
        ProgrammingError, Warning
        )

# конфигурация соединения с базой данных
MYSQLCONF = {
    'host': 'localhost', # хост базы данных
    'user': '******', # имя пользователя базы данных
    'password': '******', # пароль пользователя базы данных
    'db': 'test_db', # имя базы данных
    'charset': 'utf8', # используемая кодировка базы данных
    'autocommit': True, # автоматический cursor.commit()
    # извлекаемые строки из БД принимают вид словаря
    'cursorclass': cursors.DictCursor
}

# поднимаем соединение с базой данных
db = connect(**MYSQLCONF)

# открываем курсор в менеджере контекста 
# с использованием `contextlib.closing`
with closing(db.cursor()) as cursor:
    # создаем строку с запросом с использованием подстановок
    query = """INSERT INTO table (field1, field2, field3) 
               VALUES (%s, %s, %s)"""
    try:
        # выполняем запрос с необходимыми параметрами
        cursor.execute(query, (param1, param2, param3,))
    except IntegrityError:
        print(f"Дубль составного уникального ключа: {param1}, {param2}")
    except ProgrammingError as err:
        print("Ошибка в SQL-запросе", err)
    except Warning as wrn:
        print("Внимание!", wrn)
    except Error as err:
        print(err)

    # если нужно, то получаем `id` вставленной записи
    print('lastrowid =>', cursor.lastrowid)

# какой-то код
...

# еще запрос к базе данных
with closing(db.cursor()) as cursor:
    ...

# закрываем соединение с БД, если существует
if db:
    db.close()