Интернет технологии -> Perl -> Программирование на PERL
Работа с базами данных из Perl. Краткое введение в DBI. (Alex Ott)В настоящее время практически невозможно найти область применения, в которой бы не использовались базы данных. Для Web базы данных играют очень важную роль, позволяя создавать интернет-магазины, ленты новостей, сайты банков, и т.п. Для этих целей в Perl существует множество различных модулей, которые оптимизованы для работы с конкретными типами баз данных. Но как правило эти модули имеют разные наборы функций для работы с базами. Для упрощения переноса приложений был разработан модуль DBI. Он построен по модульной архитектуре -- для каждой СУБД существует драйвер, реализующий специфику работы с конкретной базой данных. Сначала мы рассмотрим основные функции работы с базами данных, а затем перейдем к практическому примеру применения DBI. Общий алгоритм работы с базой данных можно представить в следующем виде:
Подключение к базе данныхДля работы необходимо подключить модуль DBI к вашему скрипту. Это осуществляется с помощью директивы use DBI. Затем необходимо выполнить подключение к базе данных с помощью вызова функции connect. При этом функции передается строка, описывающая базу данных, имя пользователя, пароль и атрибуты, управляющие обработкой ошибкой и т.п. Вот пример:
my $dbh=DBI->connect("dbi:Pg:dbname=dbase;host=localhost;port=5432",
"user","pass");
В данном примере производится подключение к базе dbase при помощи драйвера PostgreSQL. Подключение производится под именем пользователя user с паролем pass. При удачном подключении функция возвращает дескриптор базы данных, который часто обозначают как $dbh. Дальнейшая работа с базой данных осуществляется через этот дескриптор. Выполнение SQL-выраженийДля выполнения SQL-выражений в DBI существует два метода -- использование цепочки prepare, execute; и функция do. Функция do в основном используется для выполнения выражений, не возвращающих наборов данных, такие как insert, update и delete. В качестве результата возвращается количество строк, затронутых данным выражением. Данная функция применяется к дескриптору базы данных. Вот пример использования:
$rv = $dbh->do("delete from test1 where id <20");
Набор функций prepare, execute чаще используется для выполнения выражений select, которые возвращают наборы данных. Для начала работы необходимо создать с помощью функции prepare дескриптор выражения. Данный дескриптор можно использовать для выполнения выражения с разными данными. Выполнение самого выражения производится с помощью функции execute для дескриптора выражения. При выполнении этой функции, параметры, обозначенные в SQL-выражении знаком вопроса ?, заменяются на параметры, переданные функции execute. При успешном выполнении функции возвращается истинное значение. После выполнения функции можно получать данные. Получение результатовПосле выполнения SQL-выражения мы можем получать не только данные, но и некоторую информацию о выполненном запросе. Некоторые драйвера поддерживают функцию row, которая возвращает количество строк, извлеченных запросом. Можно также получить информацию о типе и длине полей строк, возвращаемых после выполнения запроса. Для получения строки данных может использоваться функция fetchrow_array, которая возвращает список, состоящий из данных возвращенных SQL-выражением. Альтернативами данной функции могут быть функции fetchrow_arrayref и fetchrow_hashref, которые возвращают ссылки на массив или ассоциативный массив, хранящий результаты. При использовании ассоциативного списка, выполняется дополнительная работа по созданию пар "ИМЯ ПОЛЯ=ЗНАЧЕНИЕ". Для извлечения всех данных данной выборки используются функции fetchall_arrayref и fetchall_hashref. В первом случае возвращается ссылка на массив ссылок на строки данных, а во втором ссылка на ассоциативный массив, ключом которого является указанное в качестве параметра поле. При вызове fetchall_arrayref можно указать какие колонки данных могут быть включены в результат, при этом можно указывать как имена полей в выборке, так и номера необходимых полей. ТранзакцииВы можете явно управлять транзакциями с помощью функций DBI. По умолчанию действует режим, когда все действия автоматически подтверждаются. Функция begin_work начинает новую транзакцию, отключая режим автоматического подтверждения выражений. Если драйвер не поддерживает концепцию транзакций, то возвращается ошибка. Функции commit и rollback соответственно подтверждают или отменяют выполненные выражения. Все эти функции применяются к дескриптору базы данных. Завершение работыВ некоторых случаях после окончания извлечения данных, возвращенных запросом, для дескриптора выражения рекомендуется выполнить функцию finish. Обычно драйвер автоматически вызывает эту функцию при извлечении всех данных. При завершении работы с базой данных вы должны для дескриптора базы данных вызвать функцию disconnect. Обычно она вызывается перед завершением работы с программой. Поведение в отношении транзакций является неопределенным. Некоторые драйвера автоматически подтверждают изменения, а некоторые автоматически отменяют их. Так что будьте осторожны. Практический примерДавайте рассмотрим процедуру, которая производит извлечение ленты
новостей из базы данных. Новости хранятся в базе данных
Вот полный текст процедуры, который будет описан далее:
Процедуре передается два параметра В строках 4-7 мы подключаемся к базе данных PostgreSQL (драйвер
базы данных называется В строках 9-21 формируется условие для SQL выражения, которое ограничивает набор отображаемых новостей. Если номер категории не задан, то отображаются новости категории 1 (главные новости). Затем в строках 22-27 формируется текст запроса и выполняется
подготовка к выполнению запроса. Если функция В строках 29-40 производится выполнение запроса и извлечение данных
с помощью функции После извлечения всех новостей, запрос закрывается и производится отключение от базы данных (строки 41-42). И в заключение сформированный хеш с результатами работы возвращается вызывающей программе, которая производит формирование страницы для пользователя. ЗаключениеСамой лучшей документацией по модулю DBI является его справочная страница доступная с помощью программ perldoc и man. Также на русский язык переведена книга Perl DBI Programming. Кроме описания работы с модулем DBI, данная книга представляет краткое введение в язык структурированных запросов SQL, а также описание других методов хранения информации, возможных при работе с Perl. DBI эффективно интегрируется с другими модулями, такими как например модули из поставки mod_perl, которые позволяют кэшировать соединения с базами данных, использовать базы данных для аутентификации и авторизации. О хитростях работы с модулем DBI и модулях, дополняющих его, мы расскажем в следующих выпусках.
|