教程 > perl 教程 > 阅读:18

perl 数据库连接——迹忆客-ag捕鱼王app官网

本章节我们将为大家介绍 perl 数据库的连接。

perl 5 中我们可以使用 dbi 模块来连接数据库。

dbi 英文全称:database independent interface,中文称为数据库独立接口。

dbi 作为 perl 语言中和数据库进行通讯的标准接口,它定义了一系列的方法,变量和常量,提供一个和具体数据库平台无关的数据库持久层。


dbi 结构

dbi 和具体数据库平台无关,我们可以将其应用在oracle, mysql 或 informix, 等数据库中。

perl db 连接
perl db 连接

图表中 dbi 获取所有 api(application programming interface:应用程序接口) 发送过来的 sql 数据,然后分发到对应的驱动上执行,最后再获取数据返回。

变量名约定

以下设置了比较常用的变量名命名方法:

  • $dsn 驱动程序对象的句柄
  • $dbh 一个数据库对象的句柄
  • $sth 一个语句或者一个查询对象的句柄
  • $h 通用的句柄 ($dbh, $sth, 或 $drh),依赖于上下文
  • $rc 操作代码返回的布什值(true 或 false)
  • $rv 操作代码返回的整数值
  • @ary 查询返回的一行值的数组(列表)
  • $rows 操作代码返回的行数值
  • $fh 文件句柄
  • undef null 值表示未定义
  • %attr 引用属性的哈希值并传到方法上

数据库连接

接下来我们以 mysql 数据库为例演示 perl 是如何对数据库进行操作的。

这里我们在 mysql 数据库创建 runoob 数据库,数据表为 websites,表结构及数据如下图所示:

perl 数据表中数据

接下来我们使用以下代码来连接数据库:

#!/usr/bin/perl -w
 
use strict;
use dbi;
 
my $host = "localhost";         # 主机地址
my $driver = "mysql";           # 接口类型 默认为 localhost
my $database = "runoob";        # 数据库
# 驱动程序对象的句柄
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();

插入操作

执行步骤:

  1. 使用 prepare() api 预处理 sql 语句。
  2. 使用 execute() api 执行 sql 语句。
  3. 使用 finish() api 释放语句句柄。
  4. 最后如果一切顺利就会提交以上执行操作。
my $sth = $dbh->prepare("insert into websites
                       (name, url, alexa, country )
                        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 $country = "usa";
my $sth = $dbh->prepare("insert into websites
                       (name, url, alexa, country )
                        values
                       (?,?,?,?)");
$sth->execute($name,$url,$alexa, $country) 
          or die $dbi::errstr;
$sth->finish();
$dbh->commit or die $dbi::errstr;

更新操作

执行步骤:

  1. 使用 prepare() api 预处理 sql 语句。
  2. 使用 execute() api 执行 sql 语句。
  3. 使用 finish() api 释放语句句柄。
  4. 最后如果一切顺利就会提交以上执行操作。
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;

应用程序还可以绑定输出和输入参数,下面例子通过用变量取代 ? 占位符的位置来执行一条更新查询:

$name = '迹忆客';
my $sth = $dbh->prepare("update websites
                        set   alexa = alexa   1 
                        where name = ?");
$sth->execute('$name') or die $dbi::errstr;
print "更新的记录数 :"   $sth->rows;
$sth->finish();

当然我们也可以绑定要设置的值,如下所示将 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();

删除数据

执行步骤:

  1. 使用 prepare() api 预处理 sql 语句。
  2. 使用 execute() api 执行 sql 语句。
  3. 使用 finish() api 释放语句句柄。
  4. 最后如果一切顺利就会提交以上执行操作。

以下数据将 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;

使用 do 语句

do 语句可以执行 update, insert, 或 delete 操作,使用他比较简短,执行成功返回true,执行失败返回 false,实例如下:

$dbh->do('delete from websites where alexa>1000');

commit 操作

commit 为提交事务,完成数据库的操作:

$dbh->commit or die $dbh->errstr;

rollback 操作

如果在 sql 执行过程中发生错误,可以回滚数据,不做任何改变:

$dbh->rollback or die $dbh->errstr;

事务

和其它的语言一样, perl dbi对数据库的操作也支持事务处理, 它的实现方式有两个:

1、 在连接数据库的时候就开始一个事务

$dbh = dbi->connect($dsn, $userid, $password, {autocommit => 0}) or die $dbi::errstr;

以上代码在连接的时候设置了autocommit为false, 也就是说当你对数据库进行更新操作的时候, 它不会自动地把那些更新直接写到数据库里, 而是要程序通过 $dbh->commit 来使数据真正地写到数据库里, 或 $dbh->rollback 来回滚刚才的操作。

2、 通过$dbh->begin_work()语句来开始一个事务

这种方式就不需要在连接数据库的时候设置 autocommit = 0 。

可以一次数据库连接进行多次事务操作, 不用每一次事务的开始都去连接一次数据库。

$rc  = $dbh->begin_work  or die $dbh->errstr;
#####################
##这里执行一些 sql 操作
#####################
$dbh->commit;    # 成功后操作
-----------------------------
$dbh->rollback;  # 失败后回滚

断开数据库连接

如果我们需要断开数据库连接,可以使用 disconnect api:

$rc = $dbh->disconnect  or warn $dbh->errstr;

查看笔记

扫码一下
查看教程更方便
网站地图