在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
上次的文章中,简单的介绍了Perl的开发环境。为了完成提到的任务,还需要做几个知识点。无论是写脚本还是做CGI,如何使用Perl来访问数据库就是很有用的一个知识。 各种语言和开发环境访问数据库有各种不同的方式,比如可以用C和数据库提供的API接口来进行访问,也可以用JDBC、ODBC、ADO等封装好的统一接口来进行访问。Perl访问数据库最常用的包是DBI,可以在www.cpan.org找到。另外还需要安装对应数据库的驱动包,例如DBD::MySQL、DBD::Oracle、DBD::Sybase或者DBD::ODBC等。具体的安装方法请参考上期文章,在此就不赘述了。 下文以常见的MySQL为例,说说如何实现对数据库的操作。 习惯在Windows下开发数据库、熟悉ADO、ADO.NET的朋友,一定对ADOConnection/ADODataSet/ADOTable等类耳熟能详。DBI的接口与之类似,但在操作方法上又有不同,对ADO熟悉的朋友不妨比较一下异同。一般来说,数据库操作由以下几个步骤组成一个常见的流程: 1. 建立一个数据库连接
1#!/usr/bin/perl -w
2use strict; 3use DBI; 4 5 6my $dbh=DBI->connect("DBI:mysql:test:192.168.1.2", 'root', 'password'); 7my $sth=$dbh->prepare("SELECT * FROM test1"); 8$sth->execute(); 9 10 11while ( my @row=$sth->fetchrow_array() ) 12
连接数据库 my $dbh=DBI->connect("DBI:mysql:test:192.168.1.2", 'root', 'password'); 我们调用DBI的方法DBI->connect来建立一个数据库的连接,如果连接成功则返回一个数据库连接句柄,之后执行SQL等操作都要把这个连接句柄作为一个操作参数。在connect调用中,首先要提供一个数据库连接串。这个连接串用冒号分为了几个部分,请看下表
在前面例子中的连接串中,DBI表示这是DBI接口的一个连接串;mysql表示要连接的数据库是MySQL数据库(如果要连接Oracle数据库,这里则是oracle),不同的数据库有不同的连接串定义,可以参考DBI对应的访问驱动的说明;test指明了连接到数据库主机上的数据库名称;192.168.1.2就是MySQL服务器的IP地址。这里要注意的是,连接串中的数据库类型mysql必须小写。如果省略了主机名,则缺省为localhost。connect方法的后面两个参数是连接数据库主机的用户名和密码,这个可是不可缺少的 J 如果在连接过程中出现任何错误,则connect的返回值都会是undef(和C语言中的NULL是一回事)。这里为了简化而略去了错误检查,实际做项目的时候应当对这些错误和返回值的进行检查。
执行SQL语句 1. my $sth=$dbh->prepare("SELECT * FROM test1");
小技巧:对SQL进行排版 常写大段SQL的朋友可能会对于SQL中的引号很头痛,每每都因为引号的问题搞的SQL语句乱成一团分辨不清。还记得上篇文章讲过的qq吗?这里正是它的好用处。由于qq中的字符串同双引号” ”内的字符串一样会对变量进行解释,同时qq还可以换行。因此使用它来对SQL进行排版是非常好的一个选择,例如像这样的一条SQL语句:
my $res_operator = $dbhandle->prepare(qq{
SELECT o_customerid, COUNT(*) AS totalMsgNum FROM mm4fcdrs WHERE (m_date>'$begindate') AND (m_date<'enddate') GROUP BY o_customerid });
通过SQL语句中的参数优化查询执行效率 在执行大量INSERT之类的语句的时候,反复向数据库服务器提交同样结构的一个SQL语句,在这种情况下可以利用prepare和SQL参数来优化执行效率: 1.先使用prepare提交一个SQL模板给数据库服务器,把其中值的部分用参数占位符代替。
1
读取记录 熟悉ADO的朋友一定知道里面有一个DataReader对象,DBI中读取数据的方法和它非常的相似。简单来说,就是单向、流式的读取数据,也就是每次只能向后读一条数据直到没有数据可以读取。 文章开头的例子中,我们用了 $sth->fetchrow_array() 方法来读取数据。其实DBI读取数据还有几种常见的方法,这几个方法是类似的,所不同的是返回记录的形式。 1.fetchrow_array
1}
3. fetchrow_hashref
1}
这里需要复习一下HASH表的操作方法。keys操作符获取HASH的键(key)的数组,$record->{$field}获得HASH表中$field对应的值。注意这里同样是引用,因此要用->操作符。
最后是收尾工作。 结束一个SQL会话 $sth->finish(); 断开数据库连接 $dbh->disconnect(); 很简单明了,就不赘述了。
Perl中利用DBI访问数据库的接口基本上就是这些了,还有一些高级的内容留给有兴趣的读者自己发掘研究了。可能有些读者会感觉没有ADO、ADO.NET操作起来方便,但是在脚本的环境下能够如此方便的操作数据库,比起用C接口来说已经方便很多了。也许,在看完这片文章之后的不久,我们可以在cpan上发现你用Perl和DBI实现出来类似 ADO.NET接口的Module和全世界的Perl程序员一起分享呢。
参考资源 《Programming the Perl DBI》 O’Reily http://dbi.perl.org/ DBI官方网站 http://www.perl.com/pub/a/1999/10/DBI.html 一个DBI编程的简短介绍 |
请发表评论