Терминология
Дескриптор - 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");
...
}
Полезные ссылки
Комментировать