Возвращаются в сценарии в виде последовательностей, содержащих последовательности (например, списков кортежей), представляющих таблицы записей баз данных. Внутри этих последовательностей записей значения полей являются обычными объектами Python, такими как строки, целые и вещественные числа (например, [(‘bob’,48), (’emily’,47)]). Значения полей могут также быть объектами специального типа, хранящими такие значения, как дата и время, а значения NULL в базе данных возвращаются в виде объекта None.
Помимо этого API определяет стандартный набор типов исключений баз данных, конструкторы специальных типов баз данных и информационные вызовы верхнего уровня, поддерживающие многопоточную модель выполнения и проверку используемых символов замены в параметризованных запросах.
Например, чтобы установить соединение с базой данных через интерфейс для Oracle, совместимый с Python, необходимо установить расширение Python для поддержки Oracle, а затем выполнить инструкцию такого вида:
connobj = connect("user/password@system")
Содержимое строкового аргумента зависит от базы данных и производителя (например, в некоторых случаях может потребоваться указать дополнительную сетевую информацию или имя локального файла), но обычно это данные, с помощью которых производится регистрация в системе базы данных. Получив объект соединения, над ним можно выполнять различные операции, в том числе:
connobj.close() закрыть соединение сейчас
(не в момент вызова __del__ объекта) connobj.commit() подтвердить текущие транзакции в базе данных connobj.rollback() откатить базу данных в начало текущих транзакций
Одно из наиболее полезных действий с объектом соединения заключается в создании объекта курсора:
cursobj = connobj.cursor() возвратить новый объект курсора для выполнения команд SQL
Объекты курсоров обладают множеством методов (например, метод close позволяет закрыть курсор раньше, чем будет выполнен его деструктор, а метод callproc вызывает хранимую процедуру), но самым важным, пожалуй, является следующий:
cursobj.execute(sqlstring [, parmeters]) выполнить запрос SQL или команду
Параметры parameters передаются в виде последовательности или отображения значений и подставляются в строку sqlstring с инструкцией SQL в соответствии с соглашениями о замене, действующими в модуле реализации интерфейса. С помощью метода execute можно выполнять различные инструкции SQL:
• инструкции определения данных DDL (например, CREATE TABLE)
• инструкции модификации данных DML (например, UPDATE или INSERT)
• инструкции запросов DQL (например, SELECT)
После выполнения инструкции SQL атрибут rowcount курсора содержит количество изменившихся (для инструкций DML) или извлеченных (для запросов DQL) строк, а атрибут description курсора содержит имена столбцов и их типы. Кроме того, в интерфейсах большинства поставщиков метод execute возвращает количество измененных или извлеченных строк. Для завершения выполнения запроса DQL необходимо вызвать один из следующих методов fetch:
tuple = cursobj.fetchone() получить следующую строку
из результата запроса
listoftuple = cursobj.fetchmany([size]) получить следующую группу строк из результата
listoftuple = cursobj.fetchall() получить все оставшиеся строки
из результата
После получения результатов с помощью метода fetch данные таблицы обрабатываются с помощью обычных операций последовательностей Python — например, можно обойти кортежи в списке результатов, полученном вызовом метода fetchall с помощью простого цикла for или выражения-генератора. Большинство интерфейсов баз данных Python позволяет также указывать значения, которые должны быть переданы в инструкции SQL, определяя символы подстановки и кортеж параметров. Например:
query = ‘SELECT name, shoesize FROM spam WHERE job = ? AND age = ?’ cursobj.execute(query, (value1, value2)) results = cursobj.fetchall() for row in results: …
В данном случае интерфейс базы данных использует параметризованные инструкции (для оптимизации и удобства) и корректно передает параметры в базу данных независимо от их типов в языке Python. Обозначения параметров в интерфейсах некоторых баз данных могут быть иными (например, в интерфейсе для Oracle используются обозначения :p1 и :p2 или два %s вместо двух ?). Во всяком случае, это не то же самое, что оператор Python форматирования строки %, а кроме того, применение параметров в запросах помогает обойти некоторые проблемы, связанные с безопасностью.
Наконец, если база данных поддерживает хранимые процедуры, их можно вызывать их с помощью метода callproc или передавая методу execute строку команды SQL CALL или EXEC. Метод callproc может генерировать таблицу с результатами, получить которую можно с помощью одного из методов fetch, и возвращает модифицированную копию входной последовательности — входные параметры остаются нетронутыми, а выходные и входные/выходные параметры замещаются новыми значениями. Описание дополнительных особенностей API, включая поддержку больших блоков двоичных данных, можно найти в документации API. А теперь рассмотрим, как реализовать работу с инструкциями SQL на языке Python.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011