`

Perl DBI 入门(转)

    博客分类:
  • Perl
阅读更多

本文是以 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 方法. 我们先看看後者如何使用.
这一段程式示在资料库中建立一个员工资料表格的方法.
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 $sql = qq{ CREATE TABLE employees ( id INTEGER NOT NULL,
name VARCHAR(128),
title VARCHAR(128),
phone CHAR(10)
) };
$dbh->do( $sql );
$dbh->commit();
$dbh->disconnect();
进阶功能
我们已经学会了连线资料库,错误侦测,以及下达简单的 SQL 述的方法. 是该学一些更有用的程式语法的时候了.
SELECT 述
在 SQL 的述中,最常使用的指令莫过於 SELECT 述. 为了使用 SELECT,我们应该先 prepare 这一段述,然後进行 execute 动作. 在下面的程式片段中,我们都会使用 statement handle $sth 有存取 SELECT 的结果.
use strict;
use DBI;
my $dbh = DBI->connect( 'dbi:DBMaker:dbsample',
'jerry',
'jeerrypassword',
{
RaiseError => 1,
AutoCommit => 0
}
)
|| die "Database connection not made: $DBI::errstr";
my $sql = qq{ SELECT * FROM employees };
my $sth = $dbh->prepare( $sql );
$sth->execute();
$dbh->disconnect();
上述程式要求 DBMaker 资料库为查询指令先准备好执行计画,之後再执行该查询指令. 到目前为止还没有任何一笔记录传回. 稍後我们会使用 bind_columns 的技术以取得资料库输出的记录. bind_columns 分别将每个输出栏位结到一个 scalar reference. 一旦呼叫到 fetch 时,这些 scalars 就会填入这资料库传回的值.
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 $sql = qq{ SELECT id, name, title, phone FROM employees };
my $sth = $dbh->prepare( $sql );
$sth->execute();
my( $id, $name, $title, $phone );
$sth->bind_columns( undef, \$id, \$name, \$title, \$phone );
while( $sth->fetch() ) {
print "$name, $title, $phone\n";
}
$sth->finish();
$dbh->disconnect();
这倒是一个列印出全公司电话连络簿的好方法,尤其是 WHERE 区块的使用让我们轻易地取出所有的资料输出! 下面会利用到 bind_param 先将 SQL 述做一次 prepare,就能够高速地执行许多次.
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 @names = ( "Larry%", "Tim%", "Randal%", "Doug%" );
my $sql = qq{ SELECT id, name, title, phone FROM employees WHERE name LIKE ? };
my $sth = $dbh->prepare( $sql );
for( @names ) {
$sth->bind_param( 1, $_);
$sth->execute();
my( $id, $name, $title, $phone );
$sth->bind_columns( undef, \$id, \$name, \$title, \$phone );
while( $sth->fetch() ) {
print "$name, $title, $phone\n";
}
}
$sth->finish();
$dbh->disconnect();
高等技巧
交易机制
到目前为止,我们的动作都还不需要使用到交易机制的功能,不过当下达 UPDATE 或是 DELETE 述时,我们就会希望使用到它了. 根据 DBI 文件指出,如果想作一套稳固的交易机制,就应该配合 eval{...} 区块来拦截错误的发生,最後再使用 commit 或 rollback 来完成整个交易程序. 这就是我们以下所要谈的内容.
本程式示保四笔记录写入资料库的方法.
use strict;
use DBI qw(:sql_types);
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

分享到:
评论

相关推荐

    perl语言编程和perl语言入门

    Perl语言编程和Perl语言入门是两个关键的学习领域,分别对应着对Perl的深入理解和基础掌握。 《Perl语言编程》可能是关于Perl的高级教程,涵盖了语言的复杂特性,如正则表达式、模块化编程、对象导向编程、异常处理...

    Perl.DBI手册中文翻译版.pdf

    文档中可能包含了一些简单的使用示例,以帮助开发者快速入门和理解DBI的使用方法。 ### BLOB/CLOB/memo 字段处理 对于二进制大对象(BLOB)、字符大对象(CLOB)以及memo字段的处理方法在DBI中也有所涉及。 ### ...

    Perl语言入门_中文版第六版

    《Perl语言入门_中文版第六版》这本书旨在帮助初学者快速掌握Perl的基础知识和核心概念,以便在实际工作中有效地运用。 1. **Perl简介**:Perl是由Larry Wall在1987年开发的一种高级编程语言,其设计融合了C、sed、...

    Perl语言入门(第五版)英文原版.zip

    《Perl语言入门(第五版)英文原版》是学习Perl编程语言的重要参考资料,该书的第五版提供了最新的Perl语言知识,旨在帮助初学者快速掌握这一强大的脚本语言。Perl最初由Larry Wall在1987年设计开发,以其灵活性和处理...

    Perl语言入门(第五版) 中文版

    6. **模块系统**:Perl的CPAN(Comprehensive Perl Archive Network)包含了成千上万的第三方模块,这些模块扩展了Perl的功能,如LWP(用于Web请求)和DBI(数据库接口)。 7. **正则表达式**:Perl的正则表达式...

    Perl 入门 纯正的小骆驼

    5. **数据库编程**:Perl的DBI(Database Interface)模块使得数据库操作变得简单,适用于数据库驱动的应用程序。 **学习Perl的步骤** 1. **理解基础**:掌握Perl的基础语法,包括变量、控制结构、函数、数组和...

    perl语言入门第四版

    Perl的DBI模块是连接和操作数据库的标准接口,书中的章节将引导读者了解如何使用它来执行SQL查询和处理结果。 最后,书中可能会包含一些实战项目,帮助读者将所学知识应用于实际问题中,提升解决问题的能力。通过...

    perl 语言入门资料,函数大全

    通过CPAN(Comprehensive Perl Archive Network)这个庞大的资源库,你可以找到几乎任何你需要的模块,如CGI模块用于编写Web应用,DBI模块用于数据库交互,Net::FTP模块用于FTP操作等。 在入门学习Perl时,理解变量...

    Perl语言入门和提高

    Perl语言入门主要涉及以下几个核心概念: 1. **基本语法**:Perl的语句结构与C语言相似,包括变量声明、条件语句(if...else)、循环(while、for)以及函数调用。Perl中的变量类型包括标量(scalar)、数组(array...

    神奇的perl两本perl入门教材合集

    "神奇的Perl"两本入门教材合集为初学者提供了深入理解Perl语言的基础和实践经验。 首先,"神奇的Perl-Perl脚本语言最佳入门读物"可能会涵盖以下知识点: 1. **Perl简介**:介绍Perl的历史、特点和适用领域,让读者...

    Perl语言入门(第四版)

    书中会讲解如何使用CPAN(Comprehensive Perl Archive Network)查找和安装模块,以及如何在程序中引入模块,如LWP(Libwww-Perl)用于网络请求,DBI(Database Interface)用于数据库操作。 面向对象编程在现代...

    perl语言入门简明教程

    本教程旨在为初学者提供一个简单易懂的Perl语言入门指南,帮助读者快速掌握其基本语法和常用功能。 首先,Perl语言的特点之一就是其语法的灵活性。Perl借鉴了C、 awk、sed等多种语言的语法,因此对于熟悉这些语言的...

    Perl语言入门(Learning Perl).第五版.PDF

    "Learning Perl" 是Perl语言的经典入门教程,第五版更是经过了多年的实践与反馈优化,旨在为初学者提供清晰、全面的学习路径。 在Perl的世界里,学习者首先要了解其语法特性。Perl的语法受到了C语言的影响,但也有...

    Perl 语言入门(四版).rar

    9. **数据库交互**:Perl的DBI(Database Interface)模块是与各种数据库进行交互的标准接口,配合DBD(Database Driver)子模块,可以轻松连接MySQL、Oracle、SQLite等数据库。 10. **Web开发**:Perl的CGI...

    Perl语言入门(第3版)

    2. **模块**:Perl的模块系统允许程序员通过CPAN(Comprehensive Perl Archive Network)库引入外部代码,增强程序功能,如`DBI`用于数据库访问,`LWP`用于网络请求。 **四、文件和I/O操作** 1. **文件打开和关闭**...

    Perl入门及高级编程

    6. **Perl与数据库交互**:介绍DBI模块,学习如何连接和操作各种类型的数据库。 7. **Perl脚本优化**:讨论如何提高Perl代码的性能,包括内存管理和代码重构。 8. **Perl脚本的测试**:讲解Test::More等测试框架的...

    Perl 语言入门(第四版)

    ### Perl语言入门(第四版):详尽解析与学习指南 #### 一、Perl语言概览 **1.1 Larry Wall为何创建Perl** Perl由Larry Wall于1987年开发,初衷是为了解决文本处理和数据报告的问题。Larry Wall在设计Perl时,旨在...

    Perl语言入门(第五版)

    ### Perl语言入门(第五版)知识点总结 #### 一、Perl简介 - **定义与特点**:Perl(Practical Extraction and Reporting Language)是一种高级的、通用的编程语言,以其强大的文本处理能力而闻名。它支持多种编程...

    Perl入门及高级编程.rar

    Perl入门: 1. **安装Perl**:首先,你需要在你的操作系统上安装Perl解释器。对于Windows用户,可以从ActiveState官网下载Perl的安装包;而对于Linux或Mac用户,Perl通常已经预装在系统中。 2. **基本语法**:Perl...

Global site tag (gtag.js) - Google Analytics