Терминология
Дескриптор - handle - это уникальный номер, который используется для идентификации объектов. Обычно дескриптор используется при работе с API, при этом смысл значения дескриптора скрыт за этим API.
Смысл существования дескрипторов в том, чтобы как-то различать единообразные объекты между собой. Например, при открытии нескольких файлов для чтения, или при установлении нескольких соединений с базами данных.
CGI::Application::Plugin::DBH - используется для простого доступа к дескриптору DBI - dbh. Особенность работы с CGI::Application::Plugin::DBH состоит в том, что соединение с заранее определенной БД не устанавливается до тех пор, пока к этой БД не будет сделан хотя бы один запрос. Если приложение отработает без обращений к БД с запросами (например, на ранней стадии будет обнаружена ошибка и выполнение приложения будет прервано) - соединение не будет установлено. Экономия времени выполнения и ресурсов сервера очевидна.
Методы
dbh
|
1 |
my @row_ary = $self->dbh->selectrow_array("SELECT * FROM table_name LIMIT 1"); |
Метод возвращает дескриптор базы данных DBI. Дескриптор создается при первом вызове данного метода, и просто возвращается при последующих обращениях к методу.
Если требуется использовать сразу несколько разных баз данных и, соответственно, дескрипторов, можно назначать для дескрипторов разные имена, и в дальнейшем обращаться к дескриптору по имени.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
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); } |
|
1 2 |
my ($login) = $self->dbh->selectrow_array( "SELECT login FROM auth WHERE contract_id=$contract_id LIMIT 1"); |
|
1 2 |
my $rows = $self->dbh->do("INSERT INTO auth (login, pass) VALUES (?, ?)", undef, ($login, $pass)); |
|
1 2 3 |
my $sql = "UPDATE auth SET contract_id=$contract_id WHERE login=$login"; my $sth = $self->dbh->prepare($sql); $sth->execute; |
dbh_config
|
1 2 3 4 5 6 |
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() не указано. Используется при работе с двумя и более дескрипторами в одном приложении - очень удобно.
Если задать метод без параметров - вернет имя дескриптора, который назначен для вызова "по-умолчанию".
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
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/~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