麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 編程 > Ruby > 正文

在Ruby程序中連接數(shù)據(jù)庫(kù)的詳細(xì)教程

2020-10-29 19:41:45
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本章節(jié)將向您講解如何使用 Ruby 訪問(wèn)數(shù)據(jù)庫(kù)。Ruby DBI 模塊為 Ruby 腳本提供了類似于 Perl DBI 模塊的獨(dú)立于數(shù)據(jù)庫(kù)的接口。

DBI 即 Database independent interface,代表了 Ruby 獨(dú)立于數(shù)據(jù)庫(kù)的接口。DBI 在 Ruby 代碼與底層數(shù)據(jù)庫(kù)之間提供了一個(gè)抽象層,允許您簡(jiǎn)單地實(shí)現(xiàn)數(shù)據(jù)庫(kù)切換。它定義了一系列方法、變量和規(guī)范,提供了一個(gè)獨(dú)立于數(shù)據(jù)庫(kù)的一致的數(shù)據(jù)庫(kù)接口。

DBI 可與下列進(jìn)行交互:

  •     ADO (ActiveX Data Objects)
  •     DB2
  •     Frontbase
  •     mSQL
  •     MySQL
  •     ODBC
  •     Oracle
  •     OCI8 (Oracle)
  •     PostgreSQL
  •     Proxy/Server
  •     SQLite
  •     SQLRelay

DBI 應(yīng)用架構(gòu)

DBI 獨(dú)立于任何在后臺(tái)中可用的數(shù)據(jù)庫(kù)。無(wú)論您使用的是 Oracle、MySQL、Informix,您都可以使用 DBI。下面的架構(gòu)圖清晰地說(shuō)明了這點(diǎn)。

201541090204770.jpg (381×168)

Ruby DBI 一般的架構(gòu)使用兩個(gè)層:

  •     數(shù)據(jù)庫(kù)接口(DBI)層。該層是獨(dú)立于數(shù)據(jù)庫(kù),并提供了一系列公共訪問(wèn)方法,方法的使用不分?jǐn)?shù)據(jù)庫(kù)服務(wù)器類型。
  •     數(shù)據(jù)庫(kù)驅(qū)動(dòng)(DBD)層。該層是依賴于數(shù)據(jù)庫(kù),不同的驅(qū)動(dòng)提供了對(duì)不同的數(shù)據(jù)庫(kù)引擎的訪問(wèn)。MySQL、PostgreSQL、InterBase、Oracle 等分別使用不同的驅(qū)動(dòng)。每個(gè)驅(qū)動(dòng)都負(fù)責(zé)解釋來(lái)自 DBI 層的請(qǐng)求,并把這些請(qǐng)求映射為適用于給定類型的數(shù)據(jù)庫(kù)服務(wù)器的請(qǐng)求。

先決條件

如果您想要編寫(xiě) Ruby 腳本來(lái)訪問(wèn) MySQL 數(shù)據(jù)庫(kù),您需要先安裝 Ruby MySQL 模塊。

該模塊是一個(gè) DBD,可從 http://www.tmtm.org/en/mysql/ruby/ 上下載。
獲取并安裝 Ruby/DBI

您可以從下面的鏈接下載并安裝 Ruby DBI 模塊:

http://rubyforge.org/projects/ruby-dbi/

在開(kāi)始安裝之前,請(qǐng)確保您擁有 root 權(quán)限。現(xiàn)在,請(qǐng)安裝下面的步驟進(jìn)行安裝:
步驟 1

$ tar zxf dbi-0.2.0.tar.gz

步驟 2

進(jìn)入目錄 dbi-0.2.0,在目錄中使用 setup.rb 腳本進(jìn)行配置。最常用的配置命令是 config 參數(shù)后不跟任何參數(shù)。該命令默認(rèn)配置為安裝所有的驅(qū)動(dòng)。

$ ruby setup.rb config

更具體地,您可以使用 --with 選項(xiàng)來(lái)列出了您要使用的特定部分。例如,如果只想配置主要的 DBI 模塊和 MySQL DBD 層驅(qū)動(dòng),請(qǐng)輸入下面的命令:

$ ruby setup.rb config --with=dbi,dbd_mysql

步驟 3

最后一步是建立驅(qū)動(dòng)器,使用下面命令進(jìn)行安裝:

$ ruby setup.rb setup$ ruby setup.rb install
數(shù)據(jù)庫(kù)連接

假設(shè)我們使用的是 MySQL 數(shù)據(jù)庫(kù),在連接數(shù)據(jù)庫(kù)之前,請(qǐng)確保:

  •     您已經(jīng)創(chuàng)建了一個(gè)數(shù)據(jù)庫(kù) TESTDB。
  •     您已經(jīng)在 TESTDB 中創(chuàng)建了表 EMPLOYEE。
  •     該表帶有字段 FIRST_NAME、LAST_NAME、AGE、SEX 和 INCOME。
  •     設(shè)置用戶 ID "testuser" 和密碼 "test123" 來(lái)訪問(wèn) TESTDB
  •     已經(jīng)在您的機(jī)器上正確地安裝了 Ruby 模塊 DBI。
  •     您已經(jīng)看過(guò) MySQL 教程,理解了 MySQL 基礎(chǔ)操作。

下面是連接 MySQL 數(shù)據(jù)庫(kù) "TESTDB" 的實(shí)例:

#!/usr/bin/ruby -w require "dbi" begin   # 連接到 MySQL 服務(wù)器   dbh = DBI.connect("DBI:Mysql:TESTDB:localhost",            "testuser", "test123")   # 獲取服務(wù)器版本字符串,并顯示   row = dbh.select_one("SELECT VERSION()")   puts "Server version: " + row[0]rescue DBI::DatabaseError => e   puts "An error occurred"   puts "Error code:  #{e.err}"   puts "Error message: #{e.errstr}"ensure   # 斷開(kāi)與服務(wù)器的連接   dbh.disconnect if dbhend

當(dāng)運(yùn)行這段腳本時(shí),將會(huì)在 Linux 機(jī)器上產(chǎn)生以下結(jié)果。
Server version: 5.0.45

如果建立連接時(shí)帶有數(shù)據(jù)源,則返回?cái)?shù)據(jù)庫(kù)句柄(Database Handle),并保存到 dbh 中以便后續(xù)使用,否則 dbh 將被設(shè)置為 nil 值,e.err 和 e::errstr 分別返回錯(cuò)誤代碼和錯(cuò)誤字符串。

最后,在退出這段程序之前,請(qǐng)確保關(guān)閉數(shù)據(jù)庫(kù)連接,釋放資源。
INSERT 操作

當(dāng)您想要在數(shù)據(jù)庫(kù)表中創(chuàng)建記錄時(shí),需要用到 INSERT 操作。

一旦建立了數(shù)據(jù)庫(kù)連接,我們就可以準(zhǔn)備使用 do 方法或 prepare 和 execute 方法創(chuàng)建表或創(chuàng)建插入數(shù)據(jù)表中的記錄。
使用 do 語(yǔ)句

不返回行的語(yǔ)句可通過(guò)調(diào)用 do 數(shù)據(jù)庫(kù)處理方法。該方法帶有一個(gè)語(yǔ)句字符串參數(shù),并返回該語(yǔ)句所影響的行數(shù)。

dbh.do("DROP TABLE IF EXISTS EMPLOYEE")dbh.do("CREATE TABLE EMPLOYEE (   FIRST_NAME CHAR(20) NOT NULL,   LAST_NAME CHAR(20),   AGE INT,    SEX CHAR(1),   INCOME FLOAT )" );

同樣地,您可以執(zhí)行 SQL INSERT 語(yǔ)句來(lái)創(chuàng)建記錄插入 EMPLOYEE 表中。

#!/usr/bin/ruby -w require "dbi" begin   # 連接到 MySQL 服務(wù)器   dbh = DBI.connect("DBI:Mysql:TESTDB:localhost",            "testuser", "test123")   dbh.do( "INSERT INTO EMPLOYEE(FIRST_NAME,          LAST_NAME,          AGE,      SEX,      INCOME)     VALUES ('Mac', 'Mohan', 20, 'M', 2000)" )   puts "Record has been created"   dbh.commitrescue DBI::DatabaseError => e   puts "An error occurred"   puts "Error code:  #{e.err}"   puts "Error message: #{e.errstr}"   dbh.rollbackensure   # 斷開(kāi)與服務(wù)器的連接   dbh.disconnect if dbhend
使用 prepare 和 execute

您可以使用 DBI 的 prepare 和 execute 方法來(lái)執(zhí)行 Ruby 代碼中的 SQL 語(yǔ)句。

創(chuàng)建記錄的步驟如下:

    準(zhǔn)備帶有 INSERT 語(yǔ)句的 SQL 語(yǔ)句。這將通過(guò)使用 prepare 方法來(lái)完成。
    執(zhí)行 SQL 查詢,從數(shù)據(jù)庫(kù)中選擇所有的結(jié)果。這將通過(guò)使用 execute 方法來(lái)完成。
    釋放語(yǔ)句句柄。這將通過(guò)使用 finish API 來(lái)完成。
    如果一切進(jìn)展順利,則 commit 該操作,否則您可以 rollback 完成交易。

下面是使用這兩種方法的語(yǔ)法:

sth = dbh.prepare(statement)sth.execute  ... zero or more SQL operations ...sth.finish

這兩種方法可用于傳 bind 值給 SQL 語(yǔ)句。有時(shí)候被輸入的值可能未事先給出,在這種情況下,則會(huì)用到綁定值。使用問(wèn)號(hào)(?)替代實(shí)際值,實(shí)際值通過(guò) execute() API 來(lái)傳遞。

下面的實(shí)例在 EMPLOYEE 表中創(chuàng)建了兩個(gè)記錄:

#!/usr/bin/ruby -w require "dbi" begin   # 連接到 MySQL 服務(wù)器   dbh = DBI.connect("DBI:Mysql:TESTDB:localhost",            "testuser", "test123")   sth = dbh.prepare( "INSERT INTO EMPLOYEE(FIRST_NAME,          LAST_NAME,          AGE,      SEX,      INCOME)          VALUES (?, ?, ?, ?, ?)" )   sth.execute('John', 'Poul', 25, 'M', 2300)   sth.execute('Zara', 'Ali', 17, 'F', 1000)   sth.finish   dbh.commit   puts "Record has been created"rescue DBI::DatabaseError => e   puts "An error occurred"   puts "Error code:  #{e.err}"   puts "Error message: #{e.errstr}"   dbh.rollbackensure   # 斷開(kāi)與服務(wù)器的連接   dbh.disconnect if dbhend

如果同時(shí)使用多個(gè) INSERT,那么先準(zhǔn)備一個(gè)語(yǔ)句,然后在一個(gè)循環(huán)中多次執(zhí)行它要比通過(guò)循環(huán)每次調(diào)用 do 有效率得多。
READ 操作

對(duì)任何數(shù)據(jù)庫(kù)的 READ 操作是指從數(shù)據(jù)庫(kù)中獲取有用的信息。

一旦建立了數(shù)據(jù)庫(kù)連接,我們就可以準(zhǔn)備查詢數(shù)據(jù)庫(kù)。我們可以使用 do 方法或 prepare 和 execute 方法從數(shù)據(jù)庫(kù)表中獲取值。

獲取記錄的步驟如下:

  •     基于所需的條件準(zhǔn)備 SQL 查詢。這將通過(guò)使用 prepare 方法來(lái)完成。
  •     執(zhí)行 SQL 查詢,從數(shù)據(jù)庫(kù)中選擇所有的結(jié)果。這將通過(guò)使用 execute 方法來(lái)完成。
  •     逐一獲取結(jié)果,并輸出這些結(jié)果。這將通過(guò)使用 fetch 方法來(lái)完成。
  •     釋放語(yǔ)句句柄。這將通過(guò)使用 finish 方法來(lái)完成。

下面的實(shí)例從 EMPLOYEE 表中查詢所有工資(salary)超過(guò) 1000 的記錄。

#!/usr/bin/ruby -w require "dbi" begin   # 連接到 MySQL 服務(wù)器   dbh = DBI.connect("DBI:Mysql:TESTDB:localhost",            "testuser", "test123")   sth = dbh.prepare("SELECT * FROM EMPLOYEE            WHERE INCOME > ?")   sth.execute(1000)    sth.fetch do |row|    printf "First Name: %s, Last Name : %s/n", row[0], row[1]    printf "Age: %d, Sex : %s/n", row[2], row[3]    printf "Salary :%d /n/n", row[4]   end   sth.finishrescue DBI::DatabaseError => e   puts "An error occurred"   puts "Error code:  #{e.err}"   puts "Error message: #{e.errstr}"ensure   # 斷開(kāi)與服務(wù)器的連接   dbh.disconnect if dbhend

這將產(chǎn)生以下結(jié)果:

First Name: Mac, Last Name : MohanAge: 20, Sex : MSalary :2000 First Name: John, Last Name : PoulAge: 25, Sex : MSalary :2300

還有很多從數(shù)據(jù)庫(kù)獲取記錄的方法,如果您感興趣,可以查看 Ruby DBI Read 操作。
Update 操作

對(duì)任何數(shù)據(jù)庫(kù)的 UPDATE 操作是指更新數(shù)據(jù)庫(kù)中一個(gè)或多個(gè)已有的記錄。下面的實(shí)例更新 SEX 為 'M' 的所有記錄。在這里,我們將把所有男性的 AGE 增加一歲。這將分為三步:

  •     基于所需的條件準(zhǔn)備 SQL 查詢。這將通過(guò)使用 prepare 方法來(lái)完成。
  •     執(zhí)行 SQL 查詢,從數(shù)據(jù)庫(kù)中選擇所有的結(jié)果。這將通過(guò)使用 execute 方法來(lái)完成。
  •     釋放語(yǔ)句句柄。這將通過(guò)使用 finish 方法來(lái)完成。

如果一切進(jìn)展順利,則 commit 該操作,否則您可以 rollback 完成交易。

#!/usr/bin/ruby -w require "dbi" begin   # 連接到 MySQL 服務(wù)器   dbh = DBI.connect("DBI:Mysql:TESTDB:localhost",            "testuser", "test123")   sth = dbh.prepare("UPDATE EMPLOYEE SET AGE = AGE + 1            WHERE SEX = ?")   sth.execute('M')   sth.finish   dbh.commitrescue DBI::DatabaseError => e   puts "An error occurred"   puts "Error code:  #{e.err}"   puts "Error message: #{e.errstr}"   dbh.rollbackensure   # 斷開(kāi)與服務(wù)器的連接   dbh.disconnect if dbhend

DELETE 操作

當(dāng)您想要從數(shù)據(jù)庫(kù)中刪除記錄時(shí),需要用到 DELETE 操作。下面的實(shí)例從 EMPLOYEE 中刪除 AGE 超過(guò) 20 的所有記錄。該操作的步驟如下:

  •     基于所需的條件準(zhǔn)備 SQL 查詢。這將通過(guò)使用 prepare 方法來(lái)完成。
  •     執(zhí)行 SQL 查詢,從數(shù)據(jù)庫(kù)中刪除所需的記錄。這將通過(guò)使用 execute 方法來(lái)完成。
  •     釋放語(yǔ)句句柄。這將通過(guò)使用 finish 方法來(lái)完成。
  •     如果一切進(jìn)展順利,則 commit 該操作,否則您可以 rollback 完成交易。
#!/usr/bin/ruby -w require "dbi" begin   # 連接到 MySQL 服務(wù)器   dbh = DBI.connect("DBI:Mysql:TESTDB:localhost",            "testuser", "test123")   sth = dbh.prepare("DELETE FROM EMPLOYEE            WHERE AGE > ?")   sth.execute(20)   sth.finish   dbh.commitrescue DBI::DatabaseError => e   puts "An error occurred"   puts "Error code:  #{e.err}"   puts "Error message: #{e.errstr}"   dbh.rollbackensure   # 斷開(kāi)與服務(wù)器的連接   dbh.disconnect if dbhend

執(zhí)行事務(wù)

事務(wù)是一種確保交易一致性的機(jī)制。事務(wù)應(yīng)具有下列四種屬性:

  •     原子性(Atomicity):事務(wù)的原子性指的是,事務(wù)中包含的程序作為數(shù)據(jù)庫(kù)的邏輯工作單位,它所做的對(duì)數(shù)據(jù)修改操作要么全部執(zhí)行,要么完全不執(zhí)行。
  •     一致性(Consistency):事務(wù)的一致性指的是在一個(gè)事務(wù)執(zhí)行之前和執(zhí)行之后數(shù)據(jù)庫(kù)都必須處于一致性狀態(tài)。假如數(shù)據(jù)庫(kù)的狀態(tài)滿足所有的完整性約束,就說(shuō)該數(shù)據(jù)庫(kù)是一致的。
  •     隔離性(Isolation):事務(wù)的隔離性指并發(fā)的事務(wù)是相互隔離的,即一個(gè)事務(wù)內(nèi)部的操作及正在操作的數(shù)據(jù)必須封鎖起來(lái),不被其它企圖進(jìn)行修改的事務(wù)看到。
  •     持久性(Durability):事務(wù)的持久性意味著當(dāng)系統(tǒng)或介質(zhì)發(fā)生故障時(shí),確保已提交事務(wù)的更新不能丟失。即一旦一個(gè)事務(wù)提交,它對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的改變應(yīng)該是永久性的,耐得住任何數(shù)據(jù)庫(kù)系統(tǒng)故障。持久性通過(guò)數(shù)據(jù)庫(kù)備份和恢復(fù)來(lái)保證。

DBI 提供了兩種執(zhí)行事務(wù)的方法。一種是 commit 或 rollback 方法,用于提交或回滾事務(wù)。還有一種是 transaction 方法,可用于實(shí)現(xiàn)事務(wù)。接下來(lái)我們來(lái)介紹這兩種簡(jiǎn)單的實(shí)現(xiàn)事務(wù)的方法:
方法 I

第一種方法使用 DBI 的 commit 和 rollback 方法來(lái)顯式地提交或取消事務(wù):

dbh['AutoCommit'] = false # 設(shè)置自動(dòng)提交為 false.begin dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1     WHERE FIRST_NAME = 'John'") dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1     WHERE FIRST_NAME = 'Zara'") dbh.commitrescue puts "transaction failed" dbh.rollbackenddbh['AutoCommit'] = true

方法 II

第二種方法使用 transaction 方法。這個(gè)方法相對(duì)簡(jiǎn)單些,因?yàn)樗枰粋€(gè)包含構(gòu)成事務(wù)語(yǔ)句的代碼塊。transaction 方法執(zhí)行塊,然后根據(jù)塊是否執(zhí)行成功,自動(dòng)調(diào)用 commit 或 rollback:

dbh['AutoCommit'] = false # 設(shè)置自動(dòng)提交為 falsedbh.transaction do |dbh| dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1     WHERE FIRST_NAME = 'John'") dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1     WHERE FIRST_NAME = 'Zara'")enddbh['AutoCommit'] = true

COMMIT 操作

Commit 是一種標(biāo)識(shí)數(shù)據(jù)庫(kù)已完成更改的操作,在這個(gè)操作后,所有的更改都不可恢復(fù)。

下面是一個(gè)調(diào)用 commit 方法的簡(jiǎn)單實(shí)例。

dbh.commit

ROLLBACK 操作

如果您不滿意某個(gè)或某幾個(gè)更改,您想要完全恢復(fù)這些更改,則使用 rollback 方法。

下面是一個(gè)調(diào)用 rollback 方法的簡(jiǎn)單實(shí)例。

dbh.rollback

斷開(kāi)數(shù)據(jù)庫(kù)

如需斷開(kāi)數(shù)據(jù)庫(kù)連接,請(qǐng)使用 disconnect API。

dbh.disconnect

如果用戶通過(guò) disconnect 方法關(guān)閉了數(shù)據(jù)庫(kù)連接,DBI 會(huì)回滾所有未完成的事務(wù)。但是,不需要依賴于任何 DBI 的實(shí)現(xiàn)細(xì)節(jié),您的應(yīng)用程序就能很好地顯式調(diào)用 commit 或 rollback。
處理錯(cuò)誤

有許多不同的錯(cuò)誤來(lái)源。比如在執(zhí)行 SQL 語(yǔ)句時(shí)的語(yǔ)法錯(cuò)誤,或者是連接失敗,又或者是對(duì)一個(gè)已經(jīng)取消的或完成的語(yǔ)句句柄調(diào)用 fetch 方法。

如果某個(gè) DBI 方法失敗,DBI 會(huì)拋出異常。DBI 方法會(huì)拋出任何類型的異常,但是最重要的兩種異常類是 DBI::InterfaceError 和 DBI::DatabaseError。

這些類的 Exception 對(duì)象有 err、errstr 和 state 三種屬性,分表代表了錯(cuò)誤號(hào)、一個(gè)描述性的錯(cuò)誤字符串和一個(gè)標(biāo)準(zhǔn)的錯(cuò)誤代碼。屬性具體說(shuō)明如下:

  •     err:返回所發(fā)生的錯(cuò)誤的整數(shù)表示法,如果 DBD 不支持則返回 nil。例如,Oracle DBD 返回 ORA-XXXX 錯(cuò)誤消息的數(shù)字部分。
  •     errstr:返回所發(fā)生的錯(cuò)誤的字符串表示法。
  •     state:返回所發(fā)生的錯(cuò)誤的 SQLSTATE 代碼。SQLSTATE 是五字符長(zhǎng)度的字符串。大多數(shù)的 DBD 并不支持它,所以會(huì)返回 nil。

在上面的實(shí)例中您已經(jīng)看過(guò)下面的代碼:

rescue DBI::DatabaseError => e   puts "An error occurred"   puts "Error code:  #{e.err}"   puts "Error message: #{e.errstr}"   dbh.rollbackensure   # 斷開(kāi)與服務(wù)器的連接   dbh.disconnect if dbhend

為了獲取腳本執(zhí)行時(shí)有關(guān)腳本執(zhí)行內(nèi)容的調(diào)試信息,您可以啟用跟蹤。為此,您必須首先下載 dbi/trace 模塊,然后調(diào)用控制跟蹤模式和輸出目的地的 trace 方法:

復(fù)制代碼 代碼如下:

require "dbi/trace"
..............
 
trace(mode, destination)

mode 的值可以是 0(off)、1、2 或 3,destination 的值應(yīng)該是一個(gè) IO 對(duì)象。默認(rèn)值分別是 2 和 STDERR。
方法的代碼塊

有一些創(chuàng)建句柄的方法。這些方法通過(guò)代碼塊調(diào)用。使用帶有方法的代碼塊的優(yōu)點(diǎn)是,它們?yōu)榇a塊提供了句柄作為參數(shù),當(dāng)塊終止時(shí)會(huì)自動(dòng)清除句柄。下面是一些實(shí)例,有助于理解這個(gè)概念。

  •     DBI.connect :該方法生成一個(gè)數(shù)據(jù)庫(kù)句柄,建議在塊的末尾調(diào)用 disconnect 來(lái)斷開(kāi)數(shù)據(jù)庫(kù)。
  •     dbh.prepare :該方法生成一個(gè)語(yǔ)句句柄,建議在塊的末尾調(diào)用 finish。在塊內(nèi),您必須調(diào)用 execute 方法來(lái)執(zhí)行語(yǔ)句。
  •     dbh.execute :該方法與 dbh.prepare 類似,但是 dbh.execute 不需要在塊內(nèi)調(diào)用 execute 方法。語(yǔ)句句柄會(huì)自動(dòng)執(zhí)行。

實(shí)例 1

DBI.connect 可帶有一個(gè)代碼塊,向它傳遞數(shù)據(jù)庫(kù)句柄,且會(huì)在塊的末尾自動(dòng)斷開(kāi)句柄。
dbh = DBI.connect("DBI:Mysql:TESTDB:localhost",
                   "testuser", "test123") do |dbh|
實(shí)例 2

dbh.prepare 可帶有一個(gè)代碼塊,向它傳遞語(yǔ)句句柄,且會(huì)在塊的末尾自動(dòng)調(diào)用 finish。

dbh.prepare("SHOW DATABASES") do |sth|    sth.execute    puts "Databases: " + sth.fetch_all.join(", ")end

實(shí)例 3

dbh.execute 可帶有一個(gè)代碼塊,向它傳遞語(yǔ)句句柄,且會(huì)在塊的末尾自動(dòng)調(diào)用 finish。

dbh.execute("SHOW DATABASES") do |sth|  puts "Databases: " + sth.fetch_all.join(", ")end

DBI transaction 方法也可帶有一個(gè)代碼塊,這在上面的章節(jié)中已經(jīng)講解過(guò)了。
特定驅(qū)動(dòng)程序的函數(shù)和屬性

DBI 讓數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序提供了額外的特定數(shù)據(jù)庫(kù)的函數(shù),這些函數(shù)可被用戶通過(guò)任何 Handle 對(duì)象的 func 方法進(jìn)行調(diào)用。

使用 []= or [] 方法可以設(shè)置或獲取特定驅(qū)動(dòng)程序的屬性。

DBD::Mysql 實(shí)現(xiàn)了下列特定驅(qū)動(dòng)程序的函數(shù):

201541090333160.jpg (945×780)

實(shí)例

#!/usr/bin/ruby require "dbi"begin  # 連接到 MySQL 服務(wù)器  dbh = DBI.connect("DBI:Mysql:TESTDB:localhost",            "testuser", "test123")  puts dbh.func(:client_info)  puts dbh.func(:client_version)  puts dbh.func(:host_info)  puts dbh.func(:proto_info)  puts dbh.func(:server_info)  puts dbh.func(:thread_id)  puts dbh.func(:stat)rescue DBI::DatabaseError => e  puts "An error occurred"  puts "Error code:  #{e.err}"  puts "Error message: #{e.errstr}"ensure  dbh.disconnect if dbhend

這將產(chǎn)生以下結(jié)果:

5.0.4550045Localhost via UNIX socket105.0.45150621Uptime: 384981 Threads: 1 Questions: 1101078 Slow queries: 4 /Opens: 324 Flush tables: 1 Open tables: 64 /Queries per second avg: 2.860

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产91久久久久久 | www.成人免费 | 黄色特级片黄色特级片 | 综合97| av观看国产 | 在线成人一区 | 日本成人一区 | 粉嫩一区 | 日韩电影一区二区 | 欧美a级大胆视频 | 97伦理| xxxxhdvideosex| 国产一国产一级毛片视频 | 精品国产一区二区三区四区在线 | 黄色一级毛片免费看 | 国产精品99久久久久久久女警 | 国产亚洲精品影达达兔 | 激情免费视频 | 综合精品视频 | 91精品国产99久久久久久红楼 | 成人福利视频在线 | 夏目友人帐第七季第一集 | 久久国产亚洲视频 | 一级电影免费看 | 日本在线视频免费观看 | 男女污视频在线观看 | 成人免费毛片一 | omofun 动漫在线观看 | 日韩毛片在线看 | 国产精品毛片va一区二区三区 | 欧美精品在线视频观看 | 综合网日日天干夜夜久久 | 日韩精品久久久久久 | av成人在线电影 | 久久精品视频亚洲 | 中文字幕 亚洲一区 | 天天碰夜夜操 | 久久噜噜噜精品国产亚洲综合 | 国产精品观看在线亚洲人成网 | 欧产日产国产精品乱噜噜 | 国产激情精品一区二区三区 |