Perl 數(shù)據(jù)庫連接
本章節(jié)我們將為大家介紹 Perl 數(shù)據(jù)庫的連接。
Perl 5 中我們可以使用 DBI 模塊來連接數(shù)據(jù)庫。
DBI 英文全稱:Database Independent Interface,中文稱為數(shù)據(jù)庫獨立接口。
DBI 作為 Perl 語言中和數(shù)據(jù)庫進行通訊的標準接口,它定義了一系列的方法,變量和常量,提供一個和具體數(shù)據(jù)庫平臺無關(guān)的數(shù)據(jù)庫持久層。
DBI 結(jié)構(gòu)
DBI 和具體數(shù)據(jù)庫平臺無關(guān),我們可以將其應(yīng)用在Oracle, MySQL 或 Informix, 等數(shù)據(jù)庫中。
圖表中 DBI 獲取所有 API(Application Programming Interface:應(yīng)用程序接口) 發(fā)送過來的 SQL 數(shù)據(jù),然后分發(fā)到對應(yīng)的驅(qū)動上執(zhí)行,最后再獲取數(shù)據(jù)返回。
變量名約定
以下設(shè)置了比較常用的變量名命名方法:
$dsn 驅(qū)動程序?qū)ο蟮木浔?$dbh 一個數(shù)據(jù)庫對象的句柄 $sth 一個語句或者一個查詢對象的句柄 $h 通用的句柄 ($dbh, $sth, 或 $drh),依賴于上下文 $rc 操作代碼返回的布什值(true 或 false) $rv 操作代碼返回的整數(shù)值 @ary 查詢返回的一行值的數(shù)組(列表) $rows 操作代碼返回的行數(shù)值 $fh 文件句柄 undef NULL 值表示未定義 \%attr 引用屬性的哈希值并傳到方法上
數(shù)據(jù)庫連接
接下來我們以 MySQL 數(shù)據(jù)庫為例演示 Perl 是如何對數(shù)據(jù)庫進行操作的。
這里我們在 MySQL 數(shù)據(jù)庫創(chuàng)建 w3cschool 數(shù)據(jù)庫,數(shù)據(jù)表為 Websites,表結(jié)構(gòu)及數(shù)據(jù)如下圖所示:
下載該數(shù)據(jù)表:websites_perl.sql
接下來我們使用以下代碼來連接數(shù)據(jù)庫:
#!/usr/bin/perl -w use strict; use DBI; my $host = "localhost"; # 主機地址 my $driver = "mysql"; # 接口類型 默認為 localhost my $database = "W3CSCHOOL"; # 數(shù)據(jù)庫 # 驅(qū)動程序?qū)ο蟮木浔?my $dsn = "DBI:$driver:database=$database:$host"; my $userid = "root"; # 數(shù)據(jù)庫用戶名 my $password = "123456"; # 數(shù)據(jù)庫密碼 # 連接數(shù)據(jù)庫 my $dbh = DBI->connect($dsn, $userid, $password ) or die $DBI::errstr; my $sth = $dbh->prepare("SELECT * FROM Websites"); # 預(yù)處理 SQL 語句 $sth->execute(); # 執(zhí)行 SQL 操作 # 注釋這部分使用的是綁定值操作 # $alexa = 20; # my $sth = $dbh->prepare("SELECT name, url # FROM Websites # WHERE alexa > ?"); # $sth->execute( $alexa ) or die $DBI::errstr; # 循環(huán)輸出所有數(shù)據(jù) while ( my @row = $sth->fetchrow_array() ) { print join('\t', @row)."\n"; } $sth->finish(); $dbh->disconnect();
插入操作
執(zhí)行步驟:
- 使用 prepare() API 預(yù)處理 SQL 語句。
- 使用 execute() API 執(zhí)行 SQL 語句。
- 使用 finish() API 釋放語句句柄。
- 最后如果一切順利就會提交以上執(zhí)行操作。
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;
應(yīng)用程序還可以綁定輸出和輸入?yún)?shù),下面例子通過用變量 取代 ? 占位符的位置來執(zhí)行一條插入查詢:
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;
更新操作
執(zhí)行步驟:
- 使用 prepare() API 預(yù)處理 SQL 語句。
- 使用 execute() API 執(zhí)行 SQL 語句。
- 使用 finish() API 釋放語句句柄。
- 最后如果一切順利就會提交以上執(zhí)行操作。
my $sth = $dbh->prepare("UPDATE Websites SET alexa = alexa + 1 WHERE country = 'CN'"); $sth->execute() or die $DBI::errstr; print "更新的記錄數(shù) :" + $sth->rows; $sth->finish(); $dbh->commit or die $DBI::errstr;
應(yīng)用程序還可以綁定輸出和輸入?yún)?shù),下面例子通過用變量取代 ? 占位符的位置來執(zhí)行一條更新查詢:
$name = 'W3Cschool教程'; my $sth = $dbh->prepare("UPDATE Websites SET alexa = alexa + 1 WHERE name = ?"); $sth->execute('$name') or die $DBI::errstr; print "更新的記錄數(shù) :" + $sth->rows; $sth->finish();
當然我們也可以綁定要設(shè)置的值,如下所示將 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 "更新的記錄數(shù) :" + $sth->rows; $sth->finish();
刪除數(shù)據(jù)
執(zhí)行步驟:
- 使用 prepare() API 預(yù)處理 SQL 語句。
- 使用 execute() API 執(zhí)行 SQL 語句。
- 使用 finish() API 釋放語句句柄。
- 最后如果一切順利就會提交以上執(zhí)行操作。
以下數(shù)據(jù)將 Websites 中 alexa 大于 1000 的數(shù)據(jù)都刪除:
$alexa = 1000; my $sth = $dbh->prepare("DELETE FROM Websites WHERE alexa = ?"); $sth->execute( $alexa ) or die $DBI::errstr; print "刪除的記錄數(shù) :" + $sth->rows; $sth->finish(); $dbh->commit or die $DBI::errstr;
使用 do 語句
do 語句可以執(zhí)行 UPDATE, INSERT, 或 DELETE 操作,使用他比較簡短,執(zhí)行成功返回true,執(zhí)行失敗返回 false,實例如下:
$dbh->do('DELETE FROM Websites WHERE alexa>1000');
COMMIT 操作
commit 為提交事務(wù),完成數(shù)據(jù)庫的操作:
$dbh->commit or die $dbh->errstr;
ROLLBACK 操作
如果在 SQL 執(zhí)行過程中發(fā)生錯誤,可以回滾數(shù)據(jù),不做任何改變:
$dbh->rollback or die $dbh->errstr;
事務(wù)
和其它的語言一樣, perl DBI對數(shù)據(jù)庫的操作也支持事務(wù)處理, 它的實現(xiàn)方式有兩個:
1、 在連接數(shù)據(jù)庫的時候就開始一個事務(wù)
$dbh = DBI->connect($dsn, $userid, $password, {AutoCommit => 0}) or die $DBI::errstr;
以上代碼在連接的時候設(shè)置了AutoCommit為false, 也就是說當你對數(shù)據(jù)庫進行更新操作的時候, 它不會自動地把那些更新直接寫到數(shù)據(jù)庫里, 而是要程序通過 $dbh->commit 來使數(shù)據(jù)真正地寫到數(shù)據(jù)庫里, 或 $dbh->rollback 來回滾剛才的操作。
2、 通過$dbh->begin_work()語句來開始一個事務(wù)
這種方式就不需要在連接數(shù)據(jù)庫的時候設(shè)置 AutoCommit = 0 。
可以一次數(shù)據(jù)庫連接進行多次事務(wù)操作, 不用每一次事務(wù)的開始都去連接一次數(shù)據(jù)庫。
$rc = $dbh->begin_work or die $dbh->errstr; ##################### ##這里執(zhí)行一些 SQL 操作 ##################### $dbh->commit; # 成功后操作 ----------------------------- $dbh->rollback; # 失敗后回滾
斷開數(shù)據(jù)庫連接
如果我們需要斷開數(shù)據(jù)庫連接,可以使用 disconnect API:
$rc = $dbh->disconnect or warn $dbh->errstr;
更多建議: