Latest web development tutorials

Perl 數據庫連接

本章節我們將為大家介紹Perl 數據庫的連接。

Perl 5 中我們可以使用DBI 模塊來連接數據庫。

DBI 英文全稱:Database Independent Interface,中文稱為數據庫獨立接口。

DBI 作為Perl 語言中和數據庫進行通訊的標準接口,它定義了一系列的方法,變量和常量,提供一個和具體數據庫平台無關的數據庫持久層。


DBI 結構

DBI 和具體數據庫平台無關,我們可以將其應用在Oracle, MySQL 或Informix, 等數據庫中。

圖表中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 數據庫創建w3big 數據庫,數據表為Websites,表結構及數據如下圖所示:

下載該數據表: http://static.w3big.com/download/websites_perl.sql

接下來我們使用以下代碼來連接數據庫:

#!/usr/bin/perl -w

use strict;
use DBI;

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

插入操作

執行步驟:

  • 使用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;

更新操作

執行步驟:

  • 使用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;

應用程序還可以綁定輸出和輸入參數,下面例子通過用變量取代? 佔位符的位置來執行一條更新查詢:

$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();

刪除數據

執行步驟:

  • 使用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;

使用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;