24-Perl 数据库连接
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 数据库连接的更多相关文章
- Perl系列文章
0.Perl书籍推荐 Perl书籍下载 密码:kkqx 下面是一些我学习Perl过程中读过完整的或部分章节的觉得好的书. 入门级别1:<Perl语言入门>即小骆驼 入门级别2:<In ...
- 转:C/C++程序员简历模板
https://github.com/geekcompany/ResumeSample/blob/master/c.md 本简历模板由国内首家互联网人才拍卖网站「 JobDeer.com 」提供. ( ...
- Rhel6-cacti+nagios+ganglia(nginx)配置文档
(lnmp平台) 系统环境: rhel6 x86_64 iptables and selinux disabled 主机: 192.168.122.185 server85.example.com 1 ...
- Linux压力测试工具Tsung安装、使用和图形报表生成
简介 Tsung 是一个压力测试工具,可以测试包括HTTP, WebDAV, PostgreSQL, MySQL, LDAP, and XMPP/Jabber等服务器.针对 HTTP 测试,Tsung ...
- jboss漏洞导致服务器中毒
中毒现象 1. 网络出现拥塞,访问延迟增加. 2. 系统定时任务表中出现异常的定时任务. 3. 出现异常进程. 4. $JBOSS_HOME/bin或/root目录下出现大量的异常文件. 现象 ...
- nginx环境下搭建nagios 3.5.0,及配置pnp4nagios画图
本文基于<LNMP最新源码安装脚本>,Nagios依赖PHP环境和perl环境,由于Nginx不支持Perl的CGI,需先来搭建Perl环境,Nagios原理介绍略.一.下载最新稳定源码包 ...
- JDBC连接(MySql)数据库步骤,以及查询、插入、删除、更新等十一个处理数据库信息的功能
主要内容: JDBC连接数据库步骤. 一个简单详细的查询数据的例子. 封装连接数据库,释放数据库连接方法. 实现查询,插入,删除,更新等十一个处理数据库信息的功能.(包括事务处理,批量更新等) 把十 ...
- 自动安装脚本-------------基于LVMP搭建Nagios 监控
Mysql初始化参数(mysql-5.6.31) /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local ...
- Msfvenom学习总结
1. –p (- -payload-options) 添加载荷payload. 载荷这个东西比较多,这个软件就是根据对应的载荷payload生成对应平台下的后门,所以只有选对payload,再填 ...
随机推荐
- Docker+Rancher构建部署流水线
工作多年,在项目部署方面, 1:以前用ftp或者rz上传更新的,每次更新算上打包.目录切换.更新遗漏.备份.出错还原.启动等工作都得搞上一来小时甚至更长,要是多两台服务器那心都凉了: 2:后来有用sv ...
- decimal模块 --数字的精度、保留小数位数、取整问题
开始之前需要注意一点是:精度值为数字的总位数,如:1.23, 精度值为3: 0.123,精度值也为3 1.更改默认精度值后,直接进行计算即可保留对应精度值 from decimal import ge ...
- pm2 常用配置项解析
1.解析 1. apps:json结构,apps是一个数组,每一个数组成员就是对应一个pm2中运行的应用 2. name:应用程序名称"app" 3. cwd:应用程序所在的目录& ...
- P1115 最大子段和&P1719 最大加权矩形
上接:DP&图论 DAY 1 上午 这两个题本质是一个亚子,所以放一起啦 DPDPDPDPDPDPDPDP P1115 最大子段和 题解 因为题目要求的是一段连续的区间,所以前缀和搞暴力??? ...
- ubuntu16.04下如何安装mkimage工具?
答: sudo apt-get install u-boot-tools -y
- ossfs挂载oss到ECS本地并设置权限
下载ossfs wget https://github.com/aliyun/ossfs/releases/download/v1.80.2/ossfs_1.80.2_ubuntu16.04_amd6 ...
- docker 管理应用程序数据和网络管理
Volume和Bind Mount Docker提供三种不同方式将数据从宿主机挂载到容器中:volumes,bind mounts和tmpfs volumes:Docker管理宿主机文件系统的一部分( ...
- 发布机制-灰度发布-例子:Windows
ylbtech-发布机制-灰度发布-例子:Windows 在传统软件产品发布过程中(例如微软的Windows 7的发布过程中),一般都会经历Pre-Alpha.Alpha.Beta.Release c ...
- 几句简单的python代码完成周公解梦功能
<周公解梦>是靠人的梦来卜吉凶的一本于民间流传的解梦书籍,共有七类梦境的解述.这是非常传统的中国文化体系的一部分,但是如何用代码来获取并搜索周公解梦的数据呢?一般情况下,要通过爬虫获取数据 ...
- MongoDB的安装及配置(Win7)
一.下载MongoDB 登录Mongodb官网https://www.mongodb.com/download-center#community 二.安装MongoDB 安装真的比较简单 next就可 ...