ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)

Выборка данных в MySQL с помощью Perl

Учебник. MySQL и Perl

Описание: в этой статье мы покажем вам, как запрашивать данные из таблиц базы данных MySQL с использованием Perl DBI.

Чтобы запросить данные из таблиц базы данных MySQL из программы Perl, используйте следующие шаги:

 

Примеры Select в MySQL с помощью Perl

Мы будем использовать следующие таблицы для примеров:

Транзакции в 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.

Exit mobile version