Роман Сузи - Язык программирования Python
Каждый столбец в таблице имеет собственное имя и тип.
Что такое DB-API 2
Вынесенная в заголовок аббревиатура объединяет два понятия: DB (Database, база данных) и API (Application Program Interface, интерфейс прикладной программы).
Таким образом, DB-API определяет интерфейс прикладной программы с базой данных. Этот интерфейс, описываемый ниже, должен реализовывать все модули расширения, которые служат для связи Python–программ с базами данных. Единый API (в настоящий момент его вторая версия) позволяет абстрагироваться от марки используемой базы данных, при необходимости довольно легко менять одну СУБД на другую, изучив всего один набор функций и методов.
DB-API 2.0 описан в PEP 249 (сайт http://www.python.org/peps/pep–0249.html/), и данное ниже описание основано именно на нем.
Описание DB API 2.0
DB API 2.0 регламентирует интерфейсы модуля расширения для работы с базой данных, методы объекта–соединения с базой, объекта–курсора текущей обрабатываемой записи, объектов различных для типов данных и их конструкторов, а также содержит рекомендации для разработчиков по реализации модулей. На сегодня Python поддерживает через модули расширения многие известные базы данных (уточнить можно на web–странице по адресу http://www.python.org/topics/database/). Ниже рассматриваются почти все положения DB-API за исключением рекомендаций для разработчиков новых модулей.
Интерфейс модуля
Здесь необходимо сказать о том, что должен предоставлять модуль для удовлетворения требований DB-API 2.0.
Доступ к базе данных осуществляется с помощью объекта–соединения (connection object). DB-API–совместимый модуль должен предоставлять функцию–конструктор connect() для класса объектов–соединений. Конструктор должен иметь следующие именованные параметры:
• dsn Название источника данных в виде строки
• user Имя пользователя
• password Пароль
• host Адрес хоста, на котором работает СУБД
• database Имя базы данных.
Методы объекта–соединения будут рассмотрены чуть позже.
Модуль определяет константы, содержащие его основные характеристики:
• apilevel Версия DB-API («1.0» или «2.0»).
• threadsafety Целочисленная константа, описывающая возможности модуля при использовании потоков управления:
• 0 Модуль не поддерживает потоки.
• 1 Потоки могут совместно использовать модуль, но не соединения.
• 2 Потоки могут совместно использовать модуль и соединения.
• 3 Потоки могут совместно использовать модуль, соединения и курсоры. (Под совместным использованием здесь понимается возможность использования упомянутых ресурсов без применения семафоров).
• paramstyle Тип используемых пометок при подстановке параметров. Возможны следующие значения этой константы:
• «format» Форматирование в стиле языка ANSI C (например, "%s", "%i").
• «pyformat» Использование именованных спецификаторов формата в стиле Python ("%(item)s»)
• «qmark» Использование знаков "?" для пометки мест подстановки параметров.
• «numeric» Использование номеров позиций (":1").
• «named» Использование имен подставляемых параметров (":name").
Модуль должен определять ряд исключений для обозначения типичных исключительных ситуаций: Warning (предупреждение), Error (ошибка), InterfaceError (ошибка интерфейса), DatabaseError (ошибка, относящаяся к базе данных). А также подклассы этого последнего исключения: DataError (ошибка обработки данных), OperationalError (ошибка в работе или сбой соединения с базой данных), IntegrityError (ошибка целостности базы данных), InternalError (внутренняя ошибка базы данных), ProgrammingError (программная ошибка, например, ошибка в синтаксисе SQL–запроса), NotSupportedError (при отсутствии поддержки запрошенного свойства).
Объект–соединение
Объект–соединение, получаемый в результате успешного вызова функции connect(), должен иметь следующие методы:
• close() Закрывает соединение с базой данных.
• commit() Завершает транзакцию.
• rollback() Откатывает начатую транзакцию (восстанавливает исходное состояние). Закрытие соединения при незавершенной транзакции автоматически производит откат транзакции.
• cursor() Возвращает объект–курсор, использующий данное соединение. Если база данных не поддерживает курсоры, модуль сопряжения должен их имитировать.
Под транзакцией понимается группа из одной или нескольких операций, которые изменяют базу данных. Транзакция соответствует логически неделимой операции над базой данных, а частичное выполнение транзакции приводит к нарушению целостности БД. Например, при переводе денег с одного счета на другой операции по уменьшению первого счета и увеличению второго являются транзакцией. Методы commit() и rollback() обозначают начало и конец транзакции в явном виде. Кстати, не все базы данных поддерживают механизм транзакций.
Следует отметить, что в зависимости от реализации DB-API 2.0 модуля, необходимо сохранять ссылку на объект–соединение в продолжение работы курсоров этого соединения. В частности, это означает, что нельзя сразу же получать объект–курсор, не привязывая объект–соединение к некоторому имени. Также нельзя оставлять объект–соединение в локальной переменной, возвращая из функции или метода объект–курсор.
Объект–курсор
Курсор (от англ. cursor — CURrrent Set Of Records, текущий набор записей) служит для работы с результатом запроса. Результатом запроса обычно является одна или несколько прямоугольных таблиц со столбцами–полями и строками–записями. Приложение может читать и обрабатывать полученные таблицы и записи в таблице по одной, поэтому в курсоре хранится информация о текущей таблице и записи. Конкретный курсор в любой момент времени связан с выполнением одной SQL–инструкции.
Атрибуты объекта–курсора тоже определены DB-API:
• arraysize Атрибут, равный количеству записей, возвращаемых методом fetchmany(). По умолчанию равен 1.
• callproc(procname[, params]) Вызывает хранимую процедуру procname с параметрами из изменчивой последовательности params. Хранимая процедура может изменить значения некоторых параметров последовательности. Метод может возвратить результат, доступ к которому осуществляется через fetch–методы.
• close() Закрывает объект–курсор.
• description Этот доступный только для чтения атрибут является последовательностью из семиэлементных последовательностей. Каждая из этих последовательностей содержит информацию, описывающую один столбец результата:
• (name, type_code, display_size, internal_size, precision, scale, null_ok) Первые два элемента (имя и тип) обязательны, а вместо остальных (размер для вывода, внутренний размер, точность, масштаб, возможность задания пустого значения) может быть значение None. Этот атрибут может быть равным None для операций, не возвращающих значения.
• execute(operation[, parameters]) Исполняет запрос к базе данных или команду СУБД. Параметры (parameters) могут быть представлены в принятой в базе данных нотации в соответствии с атрибутом paramstyle, описанным выше.
• executemany(operation, seq_of_parameters) Выполняет серию запросов или команд, подставляя параметры в заданный шаблон. Параметр seq_of_parameters задает последовательность наборов параметров.
• fetchall() Возвращает все (или все оставшиеся) записи результата запроса.
• fetchmany([size]) Возвращает следующие несколько записей из результатов запроса в виде последовательности последовательностей. Пустая последовательность означает отсутствие данных. Необязательный параметр size указывает количество возвращаемых записей (реально возвращаемых записей может быть меньше). По умолчанию size равен атрибуту arraysize объекта–курсора.
• fetchone() Возвращает следующую запись (в виде последовательности) из результата запроса или None при отсутствии данных.
• nextset() Переводит курсор к началу следующего набора данных, полученного в результате запроса (при этом часть записей в предыдущем наборе может остаться непрочитанной). Если наборов больше нет, возвращает None. Не все базы данных поддерживают возврат нескольких наборов результатов за одну операцию.
• rowcount Количество записей, полученных или затронутых в результате выполнения последнего запроса. В случае отсутствия execute–запросов или невозможности указать количество записей равен–1.
• setinputsizes(sizes) Предопределяет области памяти для параметров, используемых в операциях. Аргумент sizes задает последовательность, где каждый элемент соответствует одному входному параметру. Элемент может быть объектом–типом соответствующего параметра или целым числом, задающим длину строки. Он также может иметь значение None, если о размере входного параметра ничего нельзя сказать заранее или он предполагается очень большим. Метод должен быть вызван до execute–методов.