• 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(' ', @row)." ";
    }
    $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;

  • 相关阅读:
    webpack4 plugins 篇
    webpack4 打包静态资源
    babel 7 简单指北
    JS: 深拷贝
    JS: 数组的循环函数
    async await 的执行
    redux
    TCP通信
    理解Javascript的原型和原型链
    「译」forEach循环中你不知道的3件事
  • 原文地址:https://www.cnblogs.com/BradMiller/p/11860911.html
Copyright © 2020-2023  润新知