1.Perl 数据库连接
本章节我们将为大家介绍 Perl 数据库的连接。
Perl 5 中我们可以使用 DBI 模块来连接数据库。
DBI 英文全称:Database Independent Interface,中文称为数据库独立接口。
DBI 作为 Perl 语言中和数据库进行通讯的标准接口,它定义了一系列的方法,变量和常量,提供一个和具体数据库平台无关的数据库持久层。

2.DBI 结构
DBI 和具体数据库平台无关,我们可以将其应用在Oracle, MySQL 或 Informix, 等数据库中。
图表中 DBI 获取所有 API(Application Programming Interface:应用程序接口) 发送过来的 SQL 数据,然后分发到对应的驱动上执行,最后再获取数据返回。
Perl Script-->DBI-->DBD(oracle、mysql、informix)-->DB(oracle、mysql、informix)
2.1 变量名约定
以下设置了比较常用的变量名命名方法:
$dsn 驱动程序对象的句柄
$dbh 一个数据库对象的句柄
$sth 一个语句或者一个查询对象的句柄
$h 通用的句柄 ($dbh, $sth, 或 $drh),依赖于上下文
$rc 操作代码返回的布什值(true 或 false)
$rv 操作代码返回的整数值
@ary 查询返回的一行值的数组(列表)
$rows 操作代码返回的行数值
$fh 文件句柄
undef NULL 值表示未定义
\%attr 引用属性的哈希值并传到方法上

3.数据库连接
接下来我们以 MySQL 数据库为例演示 Perl 是如何对数据库进行操作的。
这里我们在 MySQL 数据库创建 abc 数据库,数据表为 Websites,表结构及数据如下图所示:
create Websites (id int,name varchar(20),url varchar(50),alexa int,country varchar(10));
接下来我们使用以下代码来连接数据库
#!/usr/bin/perl -w
use strict;
use DBI;
my $host = "localhost"; # 主机地址,默认为 localhost
my $driver = "mysql"; # 接口类型
my $database = "abc"; # 数据库
# 驱动程序对象的句柄
my $dsn = "DBI:$driver:database=$database:$host";
my $userid = "root"; # 数据库用户名
my $password = "123456"; # 数据库密码
# 连接数据库
my $dbh = DBI->connect($dsn, $userid, $password ) or die $DBI::errstr;
my $sth = $dbh->prepare("SELECT * FROM Websites"); # 预处理 SQL 语句
$sth->execute(); # 执行 SQL 操作
# 注释这部分使用的是绑定值操作
# $alexa = 20;
# my $sth = $dbh->prepare("SELECT name, url FROM Websites WHERE alexa > ?");
# $sth->execute( $alexa ) or die $DBI::errstr;
# 循环输出所有数据
while ( my @row = $sth->fetchrow_array() )
{
print join('\t', @row)."\n";
}
$sth->finish();
$dbh->disconnect();

4.插入操作
执行步骤:
使用 prepare() API 预处理 SQL 语句。
使用 execute() API 执行 SQL 语句。
使用 finish() API 释放语句句柄。
最后如果一切顺利就会提交以上执行操作。
my $sth = $dbh->prepare("INSERT INTO Websites (name, url, alexa, conutry ) values ('Twitter', 'https://twitter.com/', 10, 'USA')");
$sth->execute() or die $DBI::errstr;
$sth->finish();
$dbh->commit or die $DBI::errstr;
应用程序还可以绑定输出和输入参数,下面例子通过用变量 取代 ? 占位符的位置来执行一条插入查询:
my $name = "Twitter";
my $url = "https://twitter.com/";
my $alexa = 10;
my $conutry = "USA";
my $sth = $dbh->prepare("INSERT INTO Websites (name, url, alexa, conutry ) values (?,?,?,?)");
$sth->execute($name,$url,$alexa, $conutry) or die $DBI::errstr;
$sth->finish();
$dbh->commit or die $DBI::errstr;

5.更新操作
执行步骤:
使用 prepare() API 预处理 SQL 语句。
使用 execute() API 执行 SQL 语句。
使用 finish() API 释放语句句柄。
最后如果一切顺利就会提交以上执行操作。
my $sth = $dbh->prepare("UPDATE Websites SET alexa = alexa + 1 WHERE country = 'CN'");
$sth->execute() or die $DBI::errstr;
print "更新的记录数 :" + $sth->rows;
$sth->finish();
$dbh->commit or die $DBI::errstr;

5.1 应用程序还可以绑定输出和输入参数,下面例子通过用变量取代 ? 占位符的位置来执行一条更新查询:
$name = '123';
my $sth = $dbh->prepare("UPDATE Websites SET alexa = alexa + 1 WHERE name = ?");
$sth->execute('$name') or die $DBI::errstr;
print "更新的记录数 :" + $sth->rows;
$sth->finish();

5.2 当然我们也可以绑定要设置的值,如下所示将 country 为 CN 的 alexa 都修改为 1000:
$country = 'CN';
$alexa = 1000:;
my $sth = $dbh->prepare("UPDATE Websites SET alexa = ? WHERE country = ?");
$sth->execute( $alexa, '$country') or die $DBI::errstr;
print "更新的记录数 :" + $sth->rows;
$sth->finish();

6.删除数据
执行步骤:
使用 prepare() API 预处理 SQL 语句。
使用 execute() API 执行 SQL 语句。
使用 finish() API 释放语句句柄。
最后如果一切顺利就会提交以上执行操作。
以下数据将 Websites 中 alexa 大于 1000 的数据都删除:
$alexa = 1000;
my $sth = $dbh->prepare("DELETE FROM Websites WHERE alexa = ?");
$sth->execute( $alexa ) or die $DBI::errstr;
print "删除的记录数 :" + $sth->rows;
$sth->finish();
$dbh->commit or die $DBI::errstr;

7.使用 do 语句
do 语句可以执行 UPDATE, INSERT, 或 DELETE 操作,使用他比较简短,执行成功返回true,执行失败返回 false.
实例如下:
$dbh->do('DELETE FROM Websites WHERE alexa>1000');

8.COMMIT 操作
commit 为提交事务,完成数据库的操作:
$dbh->commit or die $dbh->errstr;

9.ROLLBACK 操作
如果在 SQL 执行过程中发生错误,可以回滚数据,不做任何改变:
$dbh->rollback or die $dbh->errstr;

10.事务
和其它的语言一样, perl DBI对数据库的操作也支持事务处理, 它的实现方式有两个:
10.1 在连接数据库的时候就开始一个事务
$dbh = DBI->connect($dsn, $userid, $password, {AutoCommit => 0}) or die $DBI::errstr;
以上代码在连接的时候设置了AutoCommit为false,
也就是说当你对数据库进行更新操作的时候, 它不会自动地把那些更新直接写到数据库里,
而是要程序通过 $dbh->commit 来使数据真正地写到数据库里, 或 $dbh->rollback 来回滚刚才的操作。
10.2 通过$dbh->begin_work()语句来开始一个事务
这种方式就不需要在连接数据库的时候设置 AutoCommit = 0 。
可以一次数据库连接进行多次事务操作, 不用每一次事务的开始都去连接一次数据库。
$dbh = DBI->connect($dsn, $userid, $password) or die $DBI::errstr;
$rc = $dbh->begin_work or die $dbh->errstr;
#这里执行一些 SQL 操作
$dbh->commit; # 成功后操作
$dbh->rollback; # 失败后回滚

11.断开数据库连接
如果我们需要断开数据库连接,可以使用 disconnect API:
$rc = $dbh->disconnect or warn $dbh->errstr;

24-Perl 数据库连接的更多相关文章

  1. Perl系列文章

    0.Perl书籍推荐 Perl书籍下载 密码:kkqx 下面是一些我学习Perl过程中读过完整的或部分章节的觉得好的书. 入门级别1:<Perl语言入门>即小骆驼 入门级别2:<In ...

  2. 转:C/C++程序员简历模板

    https://github.com/geekcompany/ResumeSample/blob/master/c.md 本简历模板由国内首家互联网人才拍卖网站「 JobDeer.com 」提供. ( ...

  3. Rhel6-cacti+nagios+ganglia(nginx)配置文档

    (lnmp平台) 系统环境: rhel6 x86_64 iptables and selinux disabled 主机: 192.168.122.185 server85.example.com 1 ...

  4. Linux压力测试工具Tsung安装、使用和图形报表生成

    简介 Tsung 是一个压力测试工具,可以测试包括HTTP, WebDAV, PostgreSQL, MySQL, LDAP, and XMPP/Jabber等服务器.针对 HTTP 测试,Tsung ...

  5. jboss漏洞导致服务器中毒

    中毒现象 1. 网络出现拥塞,访问延迟增加. 2. 系统定时任务表中出现异常的定时任务. 3. 出现异常进程. 4. $JBOSS_HOME/bin或/root目录下出现大量的异常文件.     现象 ...

  6. nginx环境下搭建nagios 3.5.0,及配置pnp4nagios画图

    本文基于<LNMP最新源码安装脚本>,Nagios依赖PHP环境和perl环境,由于Nginx不支持Perl的CGI,需先来搭建Perl环境,Nagios原理介绍略.一.下载最新稳定源码包 ...

  7. JDBC连接(MySql)数据库步骤,以及查询、插入、删除、更新等十一个处理数据库信息的功能

    主要内容:  JDBC连接数据库步骤. 一个简单详细的查询数据的例子. 封装连接数据库,释放数据库连接方法. 实现查询,插入,删除,更新等十一个处理数据库信息的功能.(包括事务处理,批量更新等) 把十 ...

  8. 自动安装脚本-------------基于LVMP搭建Nagios 监控

    Mysql初始化参数(mysql-5.6.31) /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local ...

  9. Msfvenom学习总结

    1.    –p (- -payload-options) 添加载荷payload. 载荷这个东西比较多,这个软件就是根据对应的载荷payload生成对应平台下的后门,所以只有选对payload,再填 ...

随机推荐

  1. IDEA checkout Git 分支 弹出 Git Checkout Problem

    1. 本地分支切换的时候(例如A切到B),会弹出来Restore workspace on branch switching 对话框,如果选择是的话,在切换分支的时候,你在当前分支(A)所做的一些还未 ...

  2. python获取hive表时间格式最大分区

    #获取表的最大分区 import boto3 from datetime import datetime,timedelta def get_max_partition(db_name,table_n ...

  3. Java通过过滤器修改header

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  4. ubuntu 17.04 添加用户到sudo组

    最近在系统中安装了KVM和docker,用KVM的时候好好的,可以直接使用virsh等命令.但是安装了docker,使用docker命令时需要在前面加上sudo,这个用起来就挺麻烦的,于是想到dock ...

  5. centos-Hadoop集群 安装同步时间

    1.安装 yum search cache ntpdate xcall.sh "yum install -y ntpdate.x86_64" 2.同步 xcall.sh " ...

  6. PHP将多个文件中的内容合并为新的文件

    function test() { $hostdir= iconv("utf-8","gbk","C:\Users\原万里\Desktop\日常笔记& ...

  7. 魔法方法 __slots__ 方法

    场景解析 网游的用户, 大量的用户本质都是类的实例化对象, 在线人数百万级时对内存是很大的挑战, 如何减少这部分的内存 方法解析 __slots__ 方法 取消默认的类实例中的  __dict__  ...

  8. 用Red5搭建支持WEB播放的实时监控视频

    用Red5搭建支持WEB播放的实时监控视频 1. 下载Red5:https://github.com/Red5/red5-server/releases 下载了Red5 1.0.6 release的Z ...

  9. Hadoop HDFS命令学习笔记

    cat Usage: hadoop fs -cat [-ignoreCrc] URI [URI ...] Copies source paths to stdout. Options The -ign ...

  10. python中计时模块timeit的使用方法

    timeit 模块: timeit 模块定义了接受两个参数的 Timer 类.两个参数都是字符串. 第一个参数是你要计时的语句或者函数. 传递给 Timer 的第二个参数是为第一个参数语句构建环境的导 ...