摘要:在本教程中,我们将向您展示如何使用 Perl DBI 从 MySQL 数据库表中查询数据。
要通过 Perl 程序查询 MySQL 数据库表中的数据,请使用以下步骤:
- 通过调用
connect()
方法连接到 MySQL 数据库。 - 使用数据库句柄对象的
prepare()
方法准备一条用于执行的SELECT
语句。prepare()
方法返回一个语句句柄对象,该对象代表 MySQL 数据库中的一条语句。 - 通过调用语句句柄对象的
execute()
方法来执行SELECT
语句。 - 调用
fetchrow_array()
、fetchrow_arrayref()
或fetchrow_hashref()
方法从结果集中获取数据,直到没有剩余行。您可以使用while
语句来迭代结果集。 - 断开与 MySQL 数据库的连接。
Perl MySQL SELECT 示例
我们将使用下表作为示例:
如果您尚未创建表,我们强烈建议您按照创建表教程创建它们。
查询一张表的数据示例
以下示例从links
表中选择数据:
#!/usr/bin/perl
use strict;
use warnings;
use v5.10; # for say() function
use DBI;
# MySQL database configurations
my $dsn = "DBI:mysql:perlmysqldb";
my $username = "root";
my $password = '';
# connect to MySQL database
my %attr = ( PrintError=>0, # turn off error reporting via warn()
RaiseError=>1 # report error via die()
);
my $dbh = DBI->connect($dsn,$username,$password,\%attr);
# query data from the links table
query_links($dbh);
# disconnect from the MySQL database
$dbh->disconnect();
Code language: Perl (perl)
主要逻辑在query_links
子例程中实现:
sub query_links{
# query from the links table
my ($dbh) = @_;
my $sql = "SELECT title,
url
FROM links";
my $sth = $dbh->prepare($sql);
# execute the query
$sth->execute();
while(my @row = $sth->fetchrow_array()){
printf("%s\t%s\n",$row[0],$row[1]);
}
$sth->finish();
}
Code language: Perl (perl)
脚本的输出如下:
MySQL Tutorial http://mysqltutorial.org/
Perl MySQL Insert Demo https://www.mysqltutorial.org/perl-mysql/perl-mysql-insert/
Perl http://www.perl.org
MySQL http://www.mysql.com
Comprehensive Perl Archive Network http://www.cpan.org/
Code language: JavaScript (javascript)
通过参数查询一张表的数据示例
我们经常将值传递给查询以根据条件选择数据。以下示例从links
表中查询具有指定目标的links
的数据:
sub query_links_by_target{
# query from the links table by target
my ($dbh,$target) = @_;
my $sql = "SELECT title,url,target
FROM links
WHERE target = ?";
my $sth = $dbh->prepare($sql);
# execute the query
$sth->execute($target);
while(my @row = $sth->fetchrow_array()){
printf("%s\t%s\n",$row[0],$row[1],$row[3]);
}
$sth->finish();
}
Code language: Perl (perl)
我们在SELECT
语句的WHERE 子句中放置一个问号作为占位符。占位符将被我们传递给execute()
方法的值替换。
例如,要选择目标为_self
的链接,请按如下方式调用子例程:
query_links_by_target($dbh,'_self');
Code language: Perl (perl)
输出是:
MySQL Tutorial http://mysqltutorial.org/ _self
MySQL http://www.mysql.com _self
Code language: JavaScript (javascript)
或者,要选择目标为_blank
的链接,请将值传递给query_links_by_target()
子例程,如下所示:
query_links_by_target($dbh,'_blank');
Code language: Perl (perl)
输出是:
Perl MySQL Insert Demo https://www.mysqltutorial.org/perl-mysql/perl-mysql-insert/ _blank
Perl http://www.perl.org _blank
Comprehensive Perl Archive Network http://www.cpan.org/ _blank
Code language: JavaScript (javascript)
查询数据并转储结果集
语句句柄对象提供了一个名为dump_results()
的便捷方法,用于快速显示结果集,而无需调用fetchrow_*
方法。
以下示例从tags
表中选择数据并使用dump_results()
方法转储结果集:
sub query_tags{
# query data from the tags table
my ($dbh) = @_;
my $sql = "SELECT * FROM tags";
my $sth = $dbh->prepare($sql);
$sth->execute();
$sth->dump_results( );
$sth->finish();
}
Code language: Perl (perl)
输出是:
'1', 'Perl'
1 rows
Code language: JavaScript (javascript)
查询多个表的数据
以下脚本使用带有INNER JOIN子句的SELECT
语句从三个表中选择数据: links
、 tags
和link_tags
表。
sub query_all{
# query data from links, tags, link_tags tables
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();
}
Code language: Perl (perl)
在此示例中,我们使用fetchrow_arrayref()
方法从结果集中获取数据。 fetchrow_arrayref()
方法返回对数组的引用而不是数组本身。 fetchrow_arrayref()
方法不像fetchrow_array()
方法那样将结果集中的每一行数据复制到新数组中,因此,它比fetchrow_array()
方法更快。
以下是脚本的输出:
Comprehensive Perl Archive Network http://www.cpan.org/ _blank Perl
Code language: JavaScript (javascript)
我们得到 1 行,因为link_tags
表中只有一行。
在本教程中,您学习了使用 Perl DBI API 从 MySQL 数据库表查询数据的各种方法。