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 資料庫。在連接到資料庫之前,請確保以下事項。如果你不知道如何在 MySQL 資料庫中創建資料庫和表,你可以藉你我們的 MySQL 教學。
- 你已經創建了一個名為你TESTDB 的資料庫。
- 你已經在 TESTDB 中創建了一個名為 TEST_TABLE 的表。
- 該表包含字段 FIRST_NAME、LAST_NAME、AGE、SEX 和 INCOME。
- 用戶ID“root”和密碼“root”被設置為訪問TESTDB。
- Perl你模塊 DBI 你正確安裝在你的機器上。
1
2cpan DBI
cpan DBD::mysql - 你已經閱讀了 MySQL 教學以了解 MySQL 基礎知識。
註:可以使用 Docker 建立一個 MySQL資料庫。連結
1 | SET NAMES utf8mb4; |
連接
1 | #!/usr/bin/perl -w |
如果與資料源建立了連接,則返回一個資料庫句柄並將其保存到 $dbh 中以供進一步使用,否則 $dbh 設置為 undef 值並且 $DBI::errstr 返回錯誤字符串。
SELECT 操作
1 | #!/usr/bin/perl -w |
執行以上程序,輸出結果為:
1 | J\tJ\t18\tmale\t99999.0000 |
INSERT 操作
1 | #!/usr/bin/perl |
執行以上程序,輸出結果為:
1 | commit ineffective with AutoCommit enabled at ./main.pl line 20. |
應用程序還可以綁定輸出和輸入參數,下面例子通過用變量取代?佔位符的位置來執行一條插入查詢:
1 | #!/usr/bin/perl |
執行以上程序,輸出結果為:
1 | commit ineffective with AutoCommit enabled at ./main.pl line 27. |
UPDATE 操作
1 | #!/usr/bin/perl |
執行以上程序,輸出結果為:
1 | commit ineffective with AutoCommit enabled at ./main.pl line 22. |
DELETE 操作
1 | #!/usr/bin/perl |
執行以上程序,輸出結果為:
1 | commit ineffective with AutoCommit enabled at ./main.pl line 22. |
Do 語句
do 語句可以執行 UPDATE, INSERT, 或 DELETE 操作,使用他比較簡短,執行成功返回true,執行失敗返回 false,範例如下:
1 | my $c = $dbh->do('DELETE FROM TEST_TABLE WHERE age = 30'); |
執行以上程序,成功刪除,輸出結果為:
1 | Deleted 1 rows |
執行以上程序,沒有刪除,輸出結果為:
1 | Deleted 0E0 rows |
COMMIT 操作
commit 為提交事務,完成資料庫的操作:
1 | $dbh->commit or die $dbh->errstr; |
ROLLBACK 操作
如果在 SQL 執行過程中發生錯誤,可以回滾資料,不做任何改變:
1 | $dbh->rollback or die $dbh->errstr; |
事務
和其它的語言一樣,perl DBI對資料庫的操作也支持事務處理它的實現方式有兩個:
- 1、 在連接資料庫的時候就開始一個事務
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。
可以一次資料庫連接進行多次事務操作,不用每一次事務的開始都去連接一次資料庫。
1 | $rc = $dbh->begin_work or die $dbh->errstr; |
斷開資料庫連接
如果我們需要斷開資料庫連接,可以使用 disconnect API:
1 | $rc = $dbh->disconnect or warn $dbh->errstr; |
註:以上參考了
Tutorialspoint, Perl - Database Access