本文是以 Perl DBI Examples 为蓝本,配合 DBMaker 好学易用的特性,以及几个浅显易懂的例 子,希望能够一步步地带领使用者学习 Perl DBI modules 存取 DBMaker 资料库的方法。而原作者 撰写主要原动力是希望藉由这篇文章的问世,以降低 DBI mailing list 中一再重出现的 FAQ。
读完本文之後,我们就能学到利用 DBI 建立一个完备的资料库程式。 以下就先由 DBI 的基本功能 开始,然後再逐步研究改善效能与可靠度技巧。
基本功能
DBI - Database independent interface for Perl. Perl DBI 是 Perl 程式语言存取资料库时的 标准应用程式介面 (API)。 DBI 中定义了一组函数、变数和一致性的资料库介面, 可满足与特定 资料库无关的特性。
值得一提的,DBI 只是一个程式介面,利用一组十分轻巧的层面, 将你的应用程式与一个以上的资 料库驱动程式紧密地结合在一起, DBI 的架构主要只是提供标准的介面,目的是为了方便使用者下 达一些简单的指令, 就可以轻易地让那些驱动程式发挥作用
首先该做的事就是建构以及安装 DBI, 详细的步骤可参考 DBI INSTALL 文件中有说明. 然後再来 就是建构出所需的资料库驱动程式,或是参考 DBD. 在每个 DBD 套件中都应该会有建构程序。 与 其他 Perl 模组相较之下, 安装 DBI/DBD 步骤算是相当容易
localhost:~/DBI-1.08$ perl Makefile.PL && make
&& make test && make install
在 DBI 与 DBD 安装完成之後, 您可以执行下列指令阅读更多的资讯:
localhost:~$ perldoc DBI
建立连线
每一种资料库都有不同的连线方式, 若是想知道特殊用法, 请务必阅读 DBD 所提供的说明文 件。 下面的例子是连线到 DBMaker 的基本方法.
use strict;
use DBI;
my $dbh = DBI->connect( 'dbi:DBMaker:dbsample',
'jerry',
'jerrypassword',
);
上述的 connect 函数用到了三个参数: 资料来源名称 (data source name, DSN), 使用者名称和密 码。 其中 DSN 的格式为 dbi:DriverName:instance. 不过我们要如何知道连线成不成功呢? 首先 可以查看 connect 的传回值,true 代表成功,false 就是代表失败。 其次,当有错误发生 时, DBI 会把错误讯息存放在 package variable $DBI::errstr 之中。
use strict;
use DBI;
my $dbh = DBI->connect( 'dbi:DBMaker:dbsample',
'jerry',
'jerrypassword',
)
|| die "Database connection not made: $DBI::errstr";
$dbh->disconnect();
结束资料库连线请使用 disconnect() 函数, 正确地使用可避免错误讯 息 "Database handle destroyed without explicit disconnect" 的发生.
选项
在连线资料库时 connect() 这个方法可以接受 hash 型态的选项,常用的选项包括 了: AutoCommit,设为 true 表示资料库交易自动确认; RaiseError,告诉 DBI 在错误发生时触 发例外 croak $DBI::errstr 而不只是仅传回错误代码;PrintError,让 DBI 以警告方 式 warn $DBI::errstr 传回错误讯息.
在下一段程式中,是希望进行采交易处理的用法,设定成 AutoCommit off,RaiseError on,而 让 PrintError 使用内定值 on.
use strict;
use DBI;
my $dbh = DBI->connect( 'dbi:DBMaker:dbsample',
'jerry',
'jerrypassword',
{
RaiseError => 1,
AutoCommit => 0
}
)
|| die "Database connection not made: $DBI::errstr";
$dbh->disconnect();
有一点要特别注意,如果资料库本身不支援交易处理的功能时,设定 AutoCommit off 会接收到错 误发生的传回值.
下达 SQL
现在开始可以对我们的资料库做一些有意义的事了. 下达至资料库的 SQL 述分成两类. 一是查询指 令,预期会有数笔资料传回,例如 SELECT,这一类的指令我们会使用 prepare 方法. 另一类的指 令,如 CREATE 和 DELETE,我们会使用 do 方法. 我们先看看後者如何使用.
这一段程式示在资料库中建立一个员工资料表格的方法.
#!/usr/bin/perl -w
use strict;
use DBI;
my $dbh = DBI->connect( 'dbi:DBMaker:dbsample',
'jerry',
'jerrypassword',
{
RaiseError => 1,
AutoCommit => 0
}
)
|| die "Database connection not made: $DBI::errstr";
my @records = (
[ 0, "Larry Wall", "Perl Author", "555-0101" ],
[ 1, "Tim Bunce", "DBI Author", "555-0202" ],
[ 2, "Randal Schwartz", "Guy at Large", "555-0303" ],
[ 3, "Doug MacEachern", "Apache Man", "555-0404" ]
);
my $sql = qq{ INSERT INTO employees VALUES ( ?, ?, ?, ? ) };
my $sth = $dbh->prepare( $sql );
for( @records ) {
eval {
$sth->bind_param( 1, @$_->[0]);
$sth->bind_param( 2, @$_->[1]);
$sth->bind_param( 3, @$_->[2]);
$sth->bind_param( 4, @$_->[3]);
$sth->execute();
$dbh->commit();
};
if( $@ ) {
warn "Database error: $DBI::errstr/n";
$dbh->rollback(); #just die if rollback is failing
}
}
$sth->finish();
$dbh->disconnect();
注意事项
关於 finish 的呼叫在我们的例子并不是必要的. 这个函数适用於 statement handle 完成时所使 用。
永远要加上 use strict。
仔细阅读 Perl DBI manual 以深入解 DBI 架构
其他资讯
DBI - A Database Interface Module for Perl 5
DBI at Hermetica
DBI mailing list information
DBI mailing list archives
Persistent connections with mod_perl