Perl 資料庫連線

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 資料庫建立 itread01 資料庫,資料表為 Websites,表結構及資料如下圖所示:

下載該資料表:http://static.itread01.com/download/websites_perl.sql

接下來我們使用以下程式碼來連線資料庫:

例項

#!/usr/bin/perl -w use strict; use DBI; my $host = "localhost"; # 主機地址 my $driver = "mysql"; # 介面型別 預設為 localhost my $database = "itread01"; # 資料庫 # 驅動程式物件的控制代碼 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;