Template Toolkit(русская редакция) |
|
||
|
Template::Plugin::DBI |
|
ОБЗОР |
[ Индекс ] [ Модули ] [ Наверх ] |
Неявное создание соединения с базой данных: # ...использование списка аргументов [% USE DBI('dbi:driver:dbname', 'user', 'pass') %] # ...использование именованных параметров [% USE DBI( database = 'dbi:driver:dbname', username = 'user', password = 'pass' ) %] # ...использование коротких именованных параметров (для ленивых людей и плохих машинисток) [% USE DBI( db = 'driver:dbname', user = 'user', pass = 'pass' ) %] # ...или существующий дескриптор DBI [% USE DBI( dbh = my_dbh_ref ) %] Явное создание соединения с базой данных: [% USE DBI %] [% DBI.connect(db, user, pass) %] ... [% DBI.connect(new_db, new_user, new_pass) %] ... [% DBI.disconnect %] # final disconnect is optional Автомагическое создание соединения с базой данных с использованием переменной окружения DBI_DSN: [% USE DBI %] Запросы к базе данных: # одношаговый запрос [% FOREACH user = DBI.query('SELECT * FROM users') %] [% user.uid %] blah blah [% user.name %] etc. etc. [% END %] # в два шага prepare/execute [% query = DBI.prepare('SELECT * FROM users WHERE uid = ?') %] [% FOREACH user = query.execute('sam') %] ... [% END %] [% FOREACH user = query.execute('abw') %] ... [% END %] Выполнение не-SELECT команд: [% IF DBI.do("DELETE FROM users WHERE uid = '$uid'") %] The user '[% uid %]' was successfully deleted. [% END %] Использование именованных DBI соединений: [% USE one = DBI(...) %] [% USE two = DBI(...) %] [% FOREACH item = one.query("SELECT ...etc...") %] ... [% END %] [% FOREACH item = two.query("SELECT ...etc...") %] ... [% END %] Связывание с таблицой базы данных (через Tie::DBI): [% people = DBI.tie('users', 'uid') %] [% me = people.abw %] # => SELECT * FROM users WHERE uid='abw' I am [% me.name %] # clobber option allows table updates (see Tie::DBI) [% people = DBI.tie('users', 'uid', clobber=1) %] [% people.abw.name = 'not a number' %] I am [% people.abw.name %] # I am a free man! |
ОПИСАНИЕ |
[ Индекс ] [ Модули ] [ Наверх ] |
Этот плагин Template Toolkit предоставляет интерфейс к perl-модулям DBI/DBD, позволяя интегрировать SQL запросы в шаблоны. Он также предоставляет интерфейс через модуль Tie::DBI (если он установлен в системе), так что вы можете обращаться к записям базы данных без использования SQL в шаблонах. Объект плагина DBI можно создать следующим образом: [% USE DBI %] Это создаст неинициализированный объект DBI. Затем можно открыть соединение с базой данных с помощью метода connect(). [% DBI.connect('dbi:driver:dbname', 'user', 'pass') %] Соединение DBI может быть открыто при создании плагина, если передать аргументы конструктору, вызываевому в директиве USE. [% USE DBI('dbi:driver:dbname', 'user', 'pass') %] Вы можете использовать именованные параметры для передачи источника данных соединения, имени пользователя и пароля. [% USE DBI(database => 'dbi:driver:dbname', username => 'user', password => 'pass') %] Для обратной совместимости с предыдущими версиями этого плагина, наряду с 'database' допускается использование 'data_source'. [% USE DBI(data_source => 'dbi:driver:dbname', username => 'user', password => 'pass') %] Ленивые хакеры Template могут предпочесть использовать 'db', 'dsn' или 'connect' в качестве сокращенной формы параметра 'database', а 'user' и 'pass' как сокращение 'username' и 'password' соответственно. В строке источника данных можно опустить префикс 'dbi:', так как плагин дописывает его автомагически. [% USE DBI(db => 'driver:dbname', user => 'user', pass => 'pass') %] Любые дополнительные атрибуты DBI можно указать как именованные параметры. Атрибут 'PrintError' по умолчанию установлен в 0, если явно не установить его в истинное занчение. [% USE DBI(db, user, pass, ChopBlanks=1) %] Плагину можно присвоить альтернативное имя переменной в рамках обычного синтаксиса Template Toolkit: [% USE mydb = DBI('dbi:driver:dbname', 'user', 'pass') %] [% FOREACH item = mydb.query('SELECT * FROM users') %] ... [% END %] Имя плагина DBI можно указать в нижнем регистре, если вам так удобнее: [% USE dbi(dsn, user, pass) %] [% FOREACH item = dbi.query('SELECT * FROM users') %] ... [% END %] Для явного закрытия соединения с текущей базой данных можно вызвать метод disconnect(), но в общем случае в этом нет необходимости, поскольку он автоматически вызвается, когда плагин выходит из области видимости. В любое время вы можете вызвать connect(), чтобы открыть соединение с другой базой данных. Предыдущее соединение будет закрыто автоматически. Внутри, вместо метода connect() используется метод DBI connect_cached(). Это позволяет кешировать соединение в окружении сервера, например когда Template Toolkit используется из обработчика Apache mod_perl. В этом случае просто включите модуль mod_env и используйте следующую директиву конфигурации сервера: SetEnv DBI_DSN "dbi:mysql:dbname;host=dbhost;user=uname;password=pword" Далее можно использовать плагин DBI без параметров или необходимости явно вызывать connect(). Загрузив плагин DBI и открыв соединение с базой данных одним из приведенных выше способов, вы можете далее делать запросы к базе данных, используя знакомую точечную нотацию: [% FOREACH user = DBI.query('SELECT * FROM users') %] [% user.uid %] blah blah [% user.name %] etc. etc. [% END %] Метод query() одновременно готовит запрос и исполняет его. Если вы хотите повторять запрос с различными параметрами, вы можете использовать отдельно prepare() и execute(). [% query = DBI.prepare('SELECT * FROM users WHERE uid = ?') %] [% FOREACH user = query.execute('sam') %] ... [% END %] [% FOREACH user = query.execute('abw') %] ... [% END %] Методы query() и execute() возвращают объект-итератор, который управляет результирующим набором. Можно сохранить ссылку на итератор и использовать метод size(), чтобы определить количество строк, возвращенных запросу. [% users = DBI.query('SELECT * FROM users') %] [% users.size %] records returned или даже [% DBI.query('SELECT * FROM users').size %]
При использовании внутри цикла FOREACH итератор всегда связывается со
специальной переменной [% FOREACH user = DBI.query('SELECT * FROM users') %] [% loop.count %]/[% loop.size %]: [% user.name %] [% END %] чтобы вывести результирующий набор в виде: 1/3: Jerry Garcia 2/3: Kurt Cobain 3/3: Freddie Mercury Более подробную информацию об итераторах и реализуемых ими методах смотрите в Template::Iterator. Плагин DBI также предоставляет метод do() для выполнение не-SELECT команд, подобных следующей: [% IF DBI.do("DELETE FROM users WHERE uid = '$uid'") %] The user '[% uid %]' was successfully deleted. [% END %] Плагин также позволяет создавать связь с таблицой в базе данных черз модуль Tie::DBI. Просто вызовите метод tie(), передав в качестве параметров имя таблицы и название поля первичного ключа. [% people = DBI.tie('person', 'uid') %] Полсе этого можно обращаться к записям таблицы базы данных как если бы они были элементами хеша 'people'. My name is [% people.abw.name %] ВАЖНОЕ ЗАМЕЧАНИЕ: XS Stash (Template::Stash::XS) в настоящий момент не поддерживает доступ к связанным хешам. Если у вас есть проблемы при использовании XS Stash, можно попробовать разрешить использование обычного модуля вместо XS. Это можно сделать установкой $Template::Config::STASH в 'Template::Stash' до создания объекта Template. |
МЕТОДЫ ОБЪЕКТА |
[ Индекс ] [ Модули ] [ Наверх ] |
connect($database, $username, $password)Устанавливает соединение с базой данных. Этот метод принимает как список аргументов, так и именованные параметры, например: [% DBI.connect( 'dbi:driver:dbname', 'timmy', 'sk8D00Dz' ) %] [% DBI.connect( database = 'dbi:driver:dbname' username = 'timmy' password = 'sk8D00Dz' ) %] Метод connect() позволяет явно соединиться с источником данных. Он также может использоваться пересоединения существующего объекта к другому источнику данных. Если дескриптор базы данных уже существует, можно передать его плагину для повторного использования через параметр 'dbh'. [% DBI.connect( dbh = my_dbh_ref ) %] query($sql)Этот метод отправляет SQL-запрос к базе данных и создает объект-итератор для возвращения результатов. Это можно использовать непосредственно в директиве FOREACH, как показано ниже. Данные из результирующего набора запроса автоматически выбираются по строке за цикл, как требуется для эффективного расхода памяти. [% FOREACH user = DBI.query('SELECT * FROM users') %] Each [% user.field %] can be printed here [% END %] prepare($sql)Готовит запрос для последующего использования. Метод возвращает скомпилированный объект запроса (класса Template::Plugin::DBI::Query), у которого можно последовательно вызывать метод execute(). [% query = DBI.prepare('SELECT * FROM users WHERE id = ?') %] execute(@args)Исполняет предварительно подготовленный запрос. Этот метод нужно вызывать у объекта запроса, возвращаемого методом prepare(). Возвращает объект-итератор, который можно использовать непосредственно в директиве FOREACH. [% query = DBI.prepare('SELECT * FROM users WHERE manager = ?') %] [% FOREACH minion = query.execute('abw') %] [% minion.name %] [% END %] [% FOREACH minion = query.execute('sam') %] [% minion.name %] [% END %] do($sql)Метод do() выполняет SQL-выражения, не возвращающие записи. Возвращает истинное значение в случае успешного выполнения выражения. [% IF DBI.do("DELETE FROM users WHERE uid = 'sam'") %] The user was successfully deleted. [% END %] tie($table, $key, \%args)Возвращает ссылку на хеш, связанный с таблицей в базе данных, реализован через модуль Tie::DBI. Методу нужно передать в качестве аргументов имена таблицы и ключевого поля. [% people = DBI.tie('users', 'uid') %] Или, если вам так больше нравится, можно использовать именованные параметры 'table' и 'key'. [% people = DBI.tie(table='users', key='uid') %] В этом примере, модуль Tie::DBI будет преобразовывать запросы к хешу 'people' в SQL-запросы вида: SELECT * FROM users WHERE uid=? Например: [% me = people.abw %] Возвращаемая запись затем может быть использована как обычный хеш. I am [% me.name %] Пройти по всем записям таблицы можно следующим образом: [% FOREACH uid = people.keys.sort; person = people.$uid %] * [% person.id %] : [% person.name %] [% END %] С установленной опцией 'clobber' (или 'CLOBBER'), вы можете обновить запись, и эти изменения будут автоматически отражены в базе данных. [% people = DBI.tie('users', 'uid', clobber=1) %] [% people.abw.name = 'not a number' %] I am [% people.abw.name %] # I am a free man! Также вы можете добавлять новые записи. [% people.newguy = { name = 'Nobby Newguy' ...other fields... } %] Более подробно об опции 'CLOBBER' смотрите в Tie::DBI. quote($value, $type)Вызывает метод quote() лежащего в основе дескриптора DBI для квотирования значения, указанного в соответсвующем ее типу виде. dbh()Возвращает дескриптор базы данных, используемый в текущий момент плагином. disconnect()Закрывает соединение с текущей базой данных. |
АВТОРЫ |
[ Индекс ] [ Модули ] [ Наверх ] |
Плагин DBI был написан Симоном Мэттьюсом (Simon A Matthews), и поставлялся как отдельный модуль. Он был интегрирован в состав Template Toolkit версии 2.00 и содержит доработки Энди Уардли (Andy Wardley), Крейга Барретта (Craig Barratt), Дейва Ходжкинсона (Dave Hodgkinson) и Рафаэла Китовера (Rafael Kitover). |
ВЕРСИЯ |
[ Индекс ] [ Модули ] [ Наверх ] |
2.63, поставляется в составе Template Toolkit версии 2.14, дата релиза - 4 октября 2004. |
АВТОРСКИЕ ПРАВА |
[ Индекс ] [ Модули ] [ Наверх ] |
Copyright (C) 1999-2001 Simon Matthews. All Rights Reserved Этот модуль является свободно-распространяемым программным обеспечением; вы можете распространять и/или модифицировать его на тех же условиях, что и Perl. |
СМОТРИ ТАКЖЕ |
[ Индекс ] [ Модули ] [ Наверх ] |