Ruby 教程
本章節(jié)將向您講解如何使用 Ruby 訪問數(shù)據(jù)庫。Ruby DBI 模塊為 Ruby 腳本提供了類似于 Perl DBI 模塊的獨立于數(shù)據(jù)庫的接口。
DBI 即 Database independent interface,代表了 Ruby 獨立于數(shù)據(jù)庫的接口。DBI 在 Ruby 代碼與底層數(shù)據(jù)庫之間提供了一個抽象層,允許您簡單地實現(xiàn)數(shù)據(jù)庫切換。它定義了一系列方法、變量和規(guī)范,提供了一個獨立于數(shù)據(jù)庫的一致的數(shù)據(jù)庫接口。
DBI 可與下列進(jìn)行交互:
DBI 獨立于任何在后臺中可用的數(shù)據(jù)庫。無論您使用的是 Oracle、MySQL、Informix,您都可以使用 DBI。下面的架構(gòu)圖清晰地說明了這點。
Ruby DBI 一般的架構(gòu)使用兩個層:
如果您想要編寫 Ruby 腳本來訪問 MySQL 數(shù)據(jù)庫,您需要先安裝 Ruby MySQL 模塊。
Mac OS 系統(tǒng)需要修改 ~/.bash_profile 或 ~/.profile 文件,添加如下代碼:
或者使用軟連接:
RubyGems大約創(chuàng)建于2003年11月,從Ruby 1.9版起成為Ruby標(biāo)準(zhǔn)庫的一部分。更多詳情可以查看:Ruby RubyGems
使用 gem 安裝 dbi 與 dbd-mysql:
該模塊是一個 DBD,可從 http://tmtm.org/downloads/mysql/ruby/ 上下載。
下載后最新包,解壓進(jìn)入到目錄,執(zhí)行以下命令安裝:
然后編譯:
獲取并安裝 Ruby/DBI
您可以從下面的鏈接下載并安裝 Ruby DBI 模塊:
https://github.com/erikh/ruby-dbi
在開始安裝之前,請確保您擁有 root 權(quán)限?,F(xiàn)在,請安裝下面的步驟進(jìn)行安裝:
步驟 1
或者直接下再 zip 包并解壓。
步驟 2
進(jìn)入目錄 ruby-dbi-master,在目錄中使用 setup.rb 腳本進(jìn)行配置。最常用的配置命令是 config 參數(shù)后不跟任何參數(shù)。該命令默認(rèn)配置為安裝所有的驅(qū)動。
更具體地,您可以使用 --with 選項來列出了您要使用的特定部分。例如,如果只想配置主要的 DBI 模塊和 MySQL DBD 層驅(qū)動,請輸入下面的命令:
步驟 3
最后一步是建立驅(qū)動器,使用下面命令進(jìn)行安裝:
假設(shè)我們使用的是 MySQL 數(shù)據(jù)庫,在連接數(shù)據(jù)庫之前,請確保:
下面是連接 MySQL 數(shù)據(jù)庫 "TESTDB" 的實例:
當(dāng)運行這段腳本時,將會在 Linux 機(jī)器上產(chǎn)生以下結(jié)果。
Server version: 5.0.45
如果建立連接時帶有數(shù)據(jù)源,則返回數(shù)據(jù)庫句柄(Database Handle),并保存到 dbh 中以便后續(xù)使用,否則 dbh 將被設(shè)置為 nil 值,e.err 和 e::errstr 分別返回錯誤代碼和錯誤字符串。
最后,在退出這段程序之前,請確保關(guān)閉數(shù)據(jù)庫連接,釋放資源。
當(dāng)您想要在數(shù)據(jù)庫表中創(chuàng)建記錄時,需要用到 INSERT 操作。
一旦建立了數(shù)據(jù)庫連接,我們就可以準(zhǔn)備使用 do 方法或 prepare 和 execute 方法創(chuàng)建表或創(chuàng)建插入數(shù)據(jù)表中的記錄。
不返回行的語句可通過調(diào)用 do 數(shù)據(jù)庫處理方法。該方法帶有一個語句字符串參數(shù),并返回該語句所影響的行數(shù)。
同樣地,您可以執(zhí)行 SQL INSERT 語句來創(chuàng)建記錄插入 EMPLOYEE 表中。
您可以使用 DBI 的 prepare 和 execute 方法來執(zhí)行 Ruby 代碼中的 SQL 語句。
創(chuàng)建記錄的步驟如下:
下面是使用這兩種方法的語法:
這兩種方法可用于傳 bind 值給 SQL 語句。有時候被輸入的值可能未事先給出,在這種情況下,則會用到綁定值。使用問號(?)替代實際值,實際值通過 execute() API 來傳遞。
下面的實例在 EMPLOYEE 表中創(chuàng)建了兩個記錄:
如果同時使用多個 INSERT,那么先準(zhǔn)備一個語句,然后在一個循環(huán)中多次執(zhí)行它要比通過循環(huán)每次調(diào)用 do 有效率得多。
對任何數(shù)據(jù)庫的 READ 操作是指從數(shù)據(jù)庫中獲取有用的信息。
一旦建立了數(shù)據(jù)庫連接,我們就可以準(zhǔn)備查詢數(shù)據(jù)庫。我們可以使用 do 方法或 prepare 和 execute 方法從數(shù)據(jù)庫表中獲取值。
獲取記錄的步驟如下:
下面的實例從 EMPLOYEE 表中查詢所有工資(salary)超過 1000 的記錄。
這將產(chǎn)生以下結(jié)果:
First Name: Mac, Last Name : Mohan Age: 20, Sex : M Salary :2000 First Name: John, Last Name : Poul Age: 25, Sex : M Salary :2300
對任何數(shù)據(jù)庫的 UPDATE 操作是指更新數(shù)據(jù)庫中一個或多個已有的記錄。下面的實例更新 SEX 為 'M' 的所有記錄。在這里,我們將把所有男性的 AGE 增加一歲。這將分為三步:
當(dāng)您想要從數(shù)據(jù)庫中刪除記錄時,需要用到 DELETE 操作。下面的實例從 EMPLOYEE 中刪除 AGE 超過 20 的所有記錄。該操作的步驟如下:
事務(wù)是一種確保交易一致性的機(jī)制。事務(wù)應(yīng)具有下列四種屬性:
DBI 提供了兩種執(zhí)行事務(wù)的方法。一種是 commit 或 rollback 方法,用于提交或回滾事務(wù)。還有一種是 transaction 方法,可用于實現(xiàn)事務(wù)。接下來我們來介紹這兩種簡單的實現(xiàn)事務(wù)的方法:
第一種方法使用 DBI 的 commit 和 rollback 方法來顯式地提交或取消事務(wù):
第二種方法使用 transaction 方法。這個方法相對簡單些,因為它需要一個包含構(gòu)成事務(wù)語句的代碼塊。transaction 方法執(zhí)行塊,然后根據(jù)塊是否執(zhí)行成功,自動調(diào)用 commit 或 rollback:
Commit 是一種標(biāo)識數(shù)據(jù)庫已完成更改的操作,在這個操作后,所有的更改都不可恢復(fù)。
下面是一個調(diào)用 commit 方法的簡單實例。
如果您不滿意某個或某幾個更改,您想要完全恢復(fù)這些更改,則使用 rollback 方法。
下面是一個調(diào)用 rollback 方法的簡單實例。
如需斷開數(shù)據(jù)庫連接,請使用 disconnect API。
如果用戶通過 disconnect 方法關(guān)閉了數(shù)據(jù)庫連接,DBI 會回滾所有未完成的事務(wù)。但是,不需要依賴于任何 DBI 的實現(xiàn)細(xì)節(jié),您的應(yīng)用程序就能很好地顯式調(diào)用 commit 或 rollback。
有許多不同的錯誤來源。比如在執(zhí)行 SQL 語句時的語法錯誤,或者是連接失敗,又或者是對一個已經(jīng)取消的或完成的語句句柄調(diào)用 fetch 方法。
如果某個 DBI 方法失敗,DBI 會拋出異常。DBI 方法會拋出任何類型的異常,但是最重要的兩種異常類是 DBI::InterfaceError 和 DBI::DatabaseError。
這些類的 Exception 對象有 err、errstr 和 state 三種屬性,分表代表了錯誤號、一個描述性的錯誤字符串和一個標(biāo)準(zhǔn)的錯誤代碼。屬性具體說明如下:
在上面的實例中您已經(jīng)看過下面的代碼:
為了獲取腳本執(zhí)行時有關(guān)腳本執(zhí)行內(nèi)容的調(diào)試信息,您可以啟用跟蹤。為此,您必須首先下載 dbi/trace 模塊,然后調(diào)用控制跟蹤模式和輸出目的地的 trace 方法:
mode 的值可以是 0(off)、1、2 或 3,destination 的值應(yīng)該是一個 IO 對象。默認(rèn)值分別是 2 和 STDERR。
有一些創(chuàng)建句柄的方法。這些方法通過代碼塊調(diào)用。使用帶有方法的代碼塊的優(yōu)點是,它們?yōu)榇a塊提供了句柄作為參數(shù),當(dāng)塊終止時會自動清除句柄。下面是一些實例,有助于理解這個概念。
DBI.connect 可帶有一個代碼塊,向它傳遞數(shù)據(jù)庫句柄,且會在塊的末尾自動斷開句柄。
dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") do |dbh|
dbh.prepare 可帶有一個代碼塊,向它傳遞語句句柄,且會在塊的末尾自動調(diào)用 finish。
dbh.execute 可帶有一個代碼塊,向它傳遞語句句柄,且會在塊的末尾自動調(diào)用 finish。
DBI transaction 方法也可帶有一個代碼塊,這在上面的章節(jié)中已經(jīng)講解過了。
DBI 讓數(shù)據(jù)庫驅(qū)動程序提供了額外的特定數(shù)據(jù)庫的函數(shù),這些函數(shù)可被用戶通過任何 Handle 對象的 func 方法進(jìn)行調(diào)用。
使用 []= or [] 方法可以設(shè)置或獲取特定驅(qū)動程序的屬性。
DBD::Mysql 實現(xiàn)了下列特定驅(qū)動程序的函數(shù):
序號 | 函數(shù) & 描述 |
---|---|
1 | dbh.func(:createdb, db_name) 創(chuàng)建一個新的數(shù)據(jù)庫。 |
2 | dbh.func(:dropdb, db_name) 刪除一個數(shù)據(jù)庫。 |
3 | dbh.func(:reload) 執(zhí)行重新加載操作。 |
4 | dbh.func(:shutdown) 關(guān)閉服務(wù)器。 |
5 | dbh.func(:insert_id) => Fixnum 返回該連接的最近 AUTO_INCREMENT 值。 |
6 | dbh.func(:client_info) => String 根據(jù)版本返回 MySQL 客戶端信息。 |
7 | dbh.func(:client_version) => Fixnum 根據(jù)版本返回客戶端信息。這與 :client_info 類似,但是它會返回一個 fixnum,而不是返回字符串。 |
8 | dbh.func(:host_info) => String 返回主機(jī)信息。 |
9 | dbh.func(:proto_info) => Fixnum 返回用于通信的協(xié)議。 |
10 | dbh.func(:server_info) => String 根據(jù)版本返回 MySQL 服務(wù)器端信息。 |
11 | dbh.func(:stat) => Stringb> 返回數(shù)據(jù)庫的當(dāng)前狀態(tài)。 |
12 | dbh.func(:thread_id) => Fixnum 返回當(dāng)前線程的 ID。 |