Модуль 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.DatabaseError
ошибки базы данных,MySQLdb.Error
базовый класс всех исключений базы данных,MySQLdb.IntegrityError
нарушение целостности базы данных,MySQLdb.InterfaceError
ошибки интерфейса MySQL,MySQLdb.InternalError
внутренние ошибки MySQL,MySQLdb.MySQLError
вызывается для ошибок, связанных с работой MySQL,MySQLdb.NotSupportedError
метод или API не поддерживается MySQL,MySQLdb.OperationalError
переполнение памяти, отключение от сервера MySQL и т.д.,MySQLdb.ProgrammingError
синтаксическая ошибки в инструкции SQL,MySQLdb.Warning
важные предупреждения (например, усечение данных),[Пример перехвата ошибок с
MySQLdb`](#example).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()