Описание: в этой статье мы покажем вам, как запрашивать данные из таблиц базы данных MySQL с использованием Perl DBI.
Чтобы запросить данные из таблиц базы данных MySQL из программы Perl, используйте следующие шаги:
- Подключитесь к базе данных MySQL, вызвав метод connect().
- Подготовьте оператор SELECT для выполнения, используя метод prepare() объекта-дескриптора базы данных. Метод prepare() возвращает объект дескриптора , который представляет заявление в базе данных MySQL.
- Выполните оператор SELECT, вызвав метод execute() объекта дескриптора оператора.
- Вызов fetchrow_array(), fetchrow_arrayref() или метод fetchrow_hashref() для извлечения данных из результирующего набора до тех пор, пока не остались строк. Вы можете использовать оператор while для итерации набора результатов.
- Отключиться от базы данных MySQL.
Примеры Select в MySQL с помощью Perl
Мы будем использовать следующие таблицы для примеров:
Если вы еще не создали таблицы, мы настоятельно рекомендуем создать их, следуя инструкциям по созданию таблиц.
Пример запроса данных из одной таблицы
В следующем примере выбираются данные из таблицы links:
#!/usr/bin/perl use strict; use warnings; use v5.10; # для функции say() use DBI; # Конфигурации баз данных MySQL my $dsn = "DBI:mysql:perlmysqldb"; my $username = "root"; my $password = ''; # подключение к базе данных MySQL my %attr = ( PrintError=>0, # отключение отчетов об ошибках с помощью warn() RaiseError=>1 # report error via die() ); my $dbh = DBI->connect($dsn,$username,$password,\%attr); # запрос данных из таблицы ссылок query_links($dbh); # отключитесь от базы данных MySQL $dbh->disconnect();
Основная логика реализована в подпрограмме query_links:
sub query_links{ # запрос из одной таблицы my ($dbh) = @_; my $sql = "SELECT title, url FROM links"; my $sth = $dbh->prepare($sql); # выполнение запроса $sth->execute(); while(my @row = $sth->fetchrow_array()){ printf("%s\t%s\n",$row[0],$row[1]); } $sth->finish(); }
Вывод сценария выглядит следующим образом:
MySQL Tutorial http://mysqltutorial.org/ Транзакции в MySQL с помощью Perl https://andreyex.ru/mysql/tranzaktsii-v-mysql-s-pomoshhyu-perl Perl http://www.perl.org MySQL http://www.mysql.com
Запрос данных из одной таблицы с примером параметра
Мы часто передаем значения в запрос, чтобы выбрать данные на основе условия. В следующем примере запрашиваются данные из links указанной цели из таблицы links:
sub query_links_by_target{ # запрос из таблицы ссылок по целевому объекту my ($dbh,$target) = @_; my $sql = "SELECT title,url,target FROM links WHERE target = ?"; my $sth = $dbh->prepare($sql); # выполнение запроса $sth->execute($target); while(my @row = $sth->fetchrow_array()){ printf("%s\t%s\n",$row[0],$row[1],$row[3]); } $sth->finish(); }
Мы ставим знак вопроса в качестве заполнителя в предложении WHERE в заявлении SELECT. Заполнитель будет заменен значением, которое мы передали методу execute().
Например, чтобы выбрать ссылки, целью которых является _self, вы вызываете подпрограмму следующим образом:
query_links_by_target($dbh,'_self');
Вывод:
IT Блог. Администрирование серверов на основе Linux https://andreyex.ru _self MySQL http://www.mysql.com _self
Или для выбора ссылок, целью которых является _blank, вы передаете значение подпрограмме query_links_by_target() следующим образом:
query_links_by_target($dbh,'_blank');
Вывод:
Транзакции в MySQL с помощью Perl https://andreyex.ru/mysql/tranzaktsii-v-mysql-s-pomoshhyu-perl _blank Perl http://www.perl.org _blank Comprehensive Perl Archive Network http://www.cpan.org/ _blank
Запрос данных и вывод результирующего набора
Объект дескриптора оператора предоставляет удобный метод с именем dump_results() для быстрого отображения набора результатов без вызова метода fetchrow_*.
В следующем примере выбираются данные из таблицы tags и выводится набор результатов с помощью метода dump_results():
sub query_tags{ # запрос данных из таблицы тегов my ($dbh) = @_; my $sql = "SELECT * FROM tags"; my $sth = $dbh->prepare($sql); $sth->execute(); $sth->dump_results( ); $sth->finish(); } Вывод:
'1', 'Perl' 1 rows
Запрос данных из нескольких таблиц
Следующий скрипт выбирает данные из трех таблиц: links, tags и link_tags, используя заявление SELECT с заявлением INNER JOIN.
sub query_all{ # запрос данных из таблиц links, tags, link_tags my ($dbh) = @_; my $sql = "SELECT title, url, target,tag FROM link_tags INNER JOIN links ON links.link_id = link_tags.link_id INNER JOIN tags ON tags.tag_id = link_tags.tag_id"; my $sth = $dbh->prepare($sql); $sth->execute(); while(my $array_ref = $sth->fetchrow_arrayref()){ printf("%s\t%s\t%s\t%s\n", $array_ref->[0], $array_ref->[1], $array_ref->[2], $array_ref->[3]); } $sth->finish(); }
В этом примере мы использовали метод fetchrow_arrayref() для извлечения данных из набора результатов. Метод fetchrow_arrayref() возвращает ссылку на массив , а не как сам массив. Метод fetchrow_arrayref() не копирует данные в новый массив для каждой строки в наборе результатов, как в fetchrow_array(), следовательно, быстрее, чем метод fetchrow_array().
Ниже приведен вывод сценария:
Comprehensive Perl Archive Network http://www.cpan.org/ _blank Perl
Мы получили 1 строку, потому что в таблице link_tags только одна строка.
В этой статьи вы узнали о различных способах запроса данных из таблиц базы данных MySQL с использованием API Perl DBI.