Использование CGI::Application::Plugin::DBH. Краткий обзор, примеры кода

| Нет комментариев

Терминология

Дескриптор - handle - это уникальный номер, который используется для идентификации объектов. Обычно дескриптор используется при работе с API, при этом смысл значения дескриптора скрыт за этим API.

Смысл существования дескрипторов в том, чтобы как-то различать единообразные объекты между собой. Например, при открытии нескольких файлов для чтения, или при установлении нескольких соединений с базами данных.

CGI::Application::Plugin::DBH - используется для простого доступа к дескриптору DBI - dbh. Особенность работы с CGI::Application::Plugin::DBH состоит в том, что соединение с заранее определенной БД не устанавливается до тех пор, пока к этой БД не будет сделан хотя бы один запрос. Если приложение отработает без обращений к БД с запросами (например, на ранней стадии будет обнаружена ошибка и выполнение приложения будет прервано) - соединение не будет установлено. Экономия времени выполнения и ресурсов сервера очевидна.

Методы

dbh

	my @row_ary = $self->dbh->selectrow_array("SELECT * FROM table_name LIMIT 1");

Метод возвращает дескриптор базы данных DBI. Дескриптор создается при первом вызове данного метода, и просто возвращается при последующих обращениях к методу.

Если требуется использовать сразу несколько разных баз данных и, соответственно, дескрипторов, можно назначать для дескрипторов разные имена, и в дальнейшем обращаться к дескриптору по имени.

use CGI::Application::Plugin::DBH (qw/dbh_config dbh/);
...

sub cgiapp_init  {
	my $self = shift;

	$self->dbh_config('first_db_handle', 
		['DBI:mysql:database=bd1;host=localhost', 'user1', 'super_parol']);
	$self->dbh_config('second_db_handle',
		["DBI:mysql:database=bd2;host=localhost", 'user2', 'prosto_parol']);
}
...

sub on_start {
	my $self = shift;

	my $tt_params = {
		block => 'show_form',
	};

	my @row_ary = $self->dbh('first_db_handle')->selectrow_array("SELECT * FROM any_table LIMIT 1");
	$tt_params->{'info'} = \@row_ary;


	my $dbh2 = $self->dbh('second_db_handle');
	my @row_ary2 = $dbh2->selectrow_array("SELECT * FROM some_table LIMIT 1");
	$tt_params->{'info2'} = \@row_ary2;

	return $self->tt_process('template2.tt', $tt_params);
}

	my ($login) = $self->dbh->selectrow_array(
		"SELECT login FROM auth WHERE contract_id=$contract_id LIMIT 1");
	my $rows = $self->dbh->do("INSERT INTO auth (login, pass) VALUES (?, ?)", 
		undef, ($login, $pass));
	my $sql = "UPDATE auth SET contract_id=$contract_id WHERE login=$login";
	my $sth = $self->dbh->prepare($sql);
	$sth->execute;

dbh_config

sub cgiapp_init  {
	my $self = shift;

	$self->dbh_config("DBI:mysql:database=main_bd;host=localhost", 
		'main_user', 'main_user_password');
}

Метод dbh_config используется для установки параметров подключения к БД. Рекомендуется использовать метод внутри cgiapp_init. Главное, чтобы этот метод был выполнен задолго до того, как произойдет первый вызов dbh() , иначе все закончится очень печально - "500. Ошибочка вышла".

dbh_default_name

Метод dbh_default_name() указывает название дескриптора, который будет возвращаться "по-умолчанию", если имя дескриптора при вызове метода dbh() не указано. Используется при работе с двумя и более дескрипторами в одном приложении - очень удобно.

Если задать метод без параметров - вернет имя дескриптора, который назначен для вызова "по-умолчанию".

use CGI::Application::Plugin::DBH (qw/dbh_config dbh dbh_default_name/);

sub setup {
	my $self = shift;

	$self->dbh_default_name('first_db_handle');
	$self->dbh_config('first_db_handle', 
		['DBI:mysql:database=bd1;host=localhost', 'user1', 'super_parol']);
	$self->dbh_config('second_db_handle',
		["DBI:mysql:database=bd2;host=localhost", 'user2', 'prosto_parol']);

	$self->mode_param('step');
...
}
...

sub on_start {
	my $self = shift;

	my @row_ary = $self->dbh->selectrow_array("SELECT * FROM any_table LIMIT 1");

	my $dbh2 = $self->dbh('second_db_handle');
	my @row_ary2 = $dbh2->selectrow_array("SELECT * FROM some_table LIMIT 1");
...
}

Полезные ссылки

http://search.cpan.org/perldoc?DBI
http://search.cpan.org/~markstos/CGI-Application-4.31/lib/CGI/Application.pm
http://search.cpan.org/~markstos/CGI-Application-Plugin-DBH-4.00/lib/CGI/Application/Plugin/DBH.pm

Комментировать





Хостинг предоставлен RU-CENTER.
Регистрация доменов. Хостинг