MySQL 的 API 介面(轉)

BSDLite發表於2007-08-12
MySQL 的 API 介面(轉)[@more@]  為了方便應用程式的開發,MySQL 提供了用 C 程式語言編寫的客戶機庫,它允許從任何 C 程式的內部訪問 MySQL 資料庫。客戶機庫實現應用程式程式設計介面(API),API 定義客戶機程式如何建立和執行與伺服器的通訊。

  然而,使用 C 來編寫 MySQL 程式並不受限制。許多其他語言處理器本身也是由 C 編寫的,或具有使用 C 庫的能力,所以 MySQL 客戶機庫提供了這個方法,由此, MySQL 對這些語言的約束可以建立在 C API 的上面。這就為與 MySQL 伺服器通訊而編寫應用程式提供了許多選擇。客戶機程式的 API 是用 Perl、PHP、Java、Python、C++、Tcl 和其他一些語言編寫的。

  每種語言約束都定義自己的介面,特別是訪問 MySQL 的規則。這裡沒有足夠的時間來討論 MySQL 可使用的每種 API,我們只講述最流行的三種:

  ■ C 客戶機庫 API。這是 MySQL 的基本程式設計介面。

  ■ Perl 通用目標指令碼語言的 DBI(資料庫介面)API。DBI 是作為與其他模組在 DBD(資料庫驅動程式)級介面的 Perl 模組來實現的,每個模組都提供對特定型別的資料庫引擎的訪問(當然,我們將討論的特定的 DBD 模組也提供對 MySQL 的支援)。DBI 對 MySQL 的最普遍用法是編寫由命令列來呼叫的獨立的客戶機,以及試圖由 Web 伺服器呼叫的指令碼來提供 Web 對 MySQL 的訪問。

  ■ PHP API。PHP 是一種指令碼語言,它提供了在 Web 頁中嵌入程式的一種便利的方法。在傳送以前,這樣的頁面由 PHP 來處理,它允許這些指令碼生成動態的內容,如在頁面中包括 MySQL 查詢的結果。“PHP” 原始的意思是個人主頁( Personal Home Page),但是 PHP 的成長已經遠遠超過它簡單的原始功能。PHP Web 站點現在使用的這個名稱表示“PHP:超文字預處理程式( Hypertext Preprocessor)”,它像 GNU(是 GUN 而不是 UNIX )一樣以同樣的方式自我引用。

  當標準的 MySQL 客戶機不能滿足需要時,您並不總是需要編寫自己的程式。其他一些人一直編寫程式,而這些程式中有許多是可共享得到的。只要找到幾個就能節省您的許多工作。

  以上這三種 API 都有專門章節詳細說明。本章只提供對 API 比較的概述,用來說明它們的基本特徵,並給出對特定的應用程式可能選擇某個而不是其他 API 的原因。

  當然,不必只考慮某個 API,應瞭解每個 API,並用可以明智選擇適合自己的 API。在包括若干元件的大專案中,可能使用多個 API,多種語言,這取決於每個子任務適合哪一種語言。

  CAPI 用於編譯 C 程式上下文環境內部。它是一種客戶機庫,提供可用來與 MySQL 伺服器對話的最低階別的介面——具有建立與伺服器通訊所需的能力。DBI 和 PHP 的前身 DBI 的 Perl 前身是 Mysqlperl 模組 Mysql.pm。這個模組不再被支援,而且不應該用於新的 MySQL 的開發。有一件事需要明白,Mysqlperl 是依賴於 MySQL 的,但DBI 不是。如果編寫 MySQL 的 Perl 應用程式,然後,決定想用另外一種資料庫引擎來使用它們,則移植 DBI 指令碼比 Mysqlperl 指令碼更容易一些,因為它們很少依賴於特定的資料庫引擎。

  如果獲取了訪問 MySQL 的一段 Perl 指令碼,並發現它是用 Mysqlperl 而不是 DBI 編寫的,則仍然可以使用 DBI。DBI 包括了對 Mysqlperl 的模擬支援,因此不需要安裝兩個程式包。PHP3 的前身是 PHP/FI 2.0 (FI代表“ form interpreter ,即格式解釋程式”)。像 Mysqlperl 一樣,PHP/FI 也是過時的,所以我們就不再進一步討論它了。

  MySQL C API 的起源如果已經有編寫 mSQL RDBMS 程式的經驗,那麼將注意到 MySQLC API 類似於 mSQL 相應的 C API。當 MySQL 的開發者們開始實現他們的 SQL 引擎時,許多有用的共享實用程式可用於 mSQL。要想花費最小的難度將那些 mSQL 實用程式移植為 MySQL 的實用程式是可能的,可有意地將 MySQLAPI 設計為與mSQL API 類似(MySQL 甚至帶有與 mSQL API 函式名稱相應的 MySQL 名稱的簡單的文字替代品的msql2mysql 指令碼。這個操作相對煩瑣,實際上也照顧了許多涉及為使用 MySQL 而轉換 mSQL 程式的工作)。

  MySQL 分發包提供的C 客戶機是基於這個 API 的。C 客戶機庫也作為 MySQL 對其他語言約束的基礎來提供服務,但 Java API 是一個例外。例如,透過連線 MySQLC 客戶機庫程式碼,MySQL 可用 Perl DBI 模組專有的MySQL驅動程式和 PHP 程式碼。

   Perl DBI APIDBI API 用於 Perl 指令碼語言編寫的應用程式的上下文環境內部。這種 API 在我們考慮的這三種 API 結構中是最高的,因為它可與許多資料庫工作,而同時在指令碼中可忽略許多特定資料庫的細節。DBI 經過使用兩級結構的 Perl 模組來實現。

  ■ DBI (資料庫介面)級。為客戶機指令碼提供介面。這個級別提供的是抽象介面,並不是指特定資料庫引擎。

  ■ DBD (資料庫驅動器)級。在這個級別由特定引擎的驅動程式來提供對各種資料庫引擎的支援。

  MySQL 對 DBI 的支援環境由 Msql - Mysql - modules 分發包提供。這個模組在DBD 級操作。可以從分發包名稱中分辨它,一個驅動程式可以提供對一個以上的RDBMS 的支援。Msql-Mysql-Modules 最初是為mSQL 而編寫的,後來擴充套件到MySQL。這種影響類似於對 mSQL 和 MySQL 的 CAPI。由於設計的 MySQLCAPI 類似於 mSQL CAPI,所以將 mSQL DBD(使用 mSQL C API)擴充套件到對MySQL的使用很有意義。

  DBI 體系結構編寫應用程式的風格相對普通。當編寫 DBI 指令碼時,可使用一組標準的呼叫。DBI 級在 DBD 級呼叫適當的驅動程式來處理請求,對於想使用的特定資料庫伺服器通訊中包括的特定問題,由驅動程式處理。DBD 級傳送從伺服器返回的資料,備份到 DBI 級,使資料出現在應用程式中。資料的格式與資料庫的資料來源一致。

  其結果得到這樣一個介面,該介面從應用程式的編寫者的觀點隱藏了資料庫引擎之間的差異,這樣可使用多種不同的引擎——和驅動程式一樣多。DBI 透過允許以統一風格訪問每個資料庫來提供一致性客戶介面以增加可移植性。

  當開啟資料庫時,出現由指令碼編寫的資料庫專有的介面。當建立連線時,應指出使用哪個驅動程式。

  連線以後,對該驅動程式不需要再做任何做特殊的引用。讓 DBI 和該驅動程式解決資料庫專有的細節。
無論如何這都是理論問題。然而,至少有兩個因素與 DBI 指令碼的可移植性矛盾:

  ■ 在RDBMS 引擎之間 SQL 的實現不同,為一個引擎編寫的 SQL 另一個引擎根本不理解是完全可能的。如果 SQL 相當通用,則指令碼可在引擎之間作相應的移植。但如果 SQL 依賴於引擎,則指令碼也是這樣。例如,如果使用 MySQL 指定的 SHOW TABLES 語句,則該指令碼不能用其他資料庫執行。

  ■ DBD 模組通常提供引擎專有型別的資訊來允許指令碼編寫者使用特定資料庫系統的特定功能。例如, MySQLDBD 提供訪問查詢結果中列屬性的方法,如每列的最大長度、列是否是數值型的,等等。而這些屬性在其他資料庫中沒有任何相似物。DBD 專有的特性與可移植性相背,透過使用它們,將 MySQL 編寫的指令碼用於其他資料庫系統是困難的。

  儘管存在資料庫專有指令碼的這兩個因素,但以抽象方式提供資料庫訪問的 DBI 機制是完成可移植性的合理方式,只要您決定利用它多少次即可。

  像 Perl 一樣,PHP 也是一種指令碼語言。但它與Perl 不同,PHP 很少作為通用目標語言來設計,而是作為編寫 Web 應用程式的一種語言。PHP API 主要作為在 Web 頁面中嵌入可執行指令碼的一種方法來使用。這使Web 的開發者們很容易用動態生成上下文環境來編寫頁面。

  當客戶瀏覽器向 Web 伺服器傳送 PHP 頁面的請求時,PHP 執行在該頁面中它所發現的任何指令碼,並用指令碼的輸出來替換它。該結果再送回瀏覽器。這就使瀏覽器中實際出現的頁面根據請求的頁面環境的不同而有所不同。例如,當在 Web 頁面中嵌入下面簡短的 PHP 指令碼時,它出現所請求頁面的主機 IP 地址:

  可以使用指令碼為訪問者提供基於資料庫上下文環境的最新資訊。下面的樣例說明可用於 Historical League Web 站點的一個簡單指令碼。該指令碼釋出一個請求來確定當前的 League 的成員數目,並將該數目報告給訪問該站點的人(如果出現錯誤,則該指令碼不報告任何數目):

  儘管 DBI 級是獨立於資料庫的,而 DBD 級是依賴於資料庫的,但那並不是“ DBI”和“DBD”所代表的意義。它們的意思是“資料庫介面”和“資料庫驅動程式”。

  PHP 指令碼通常看起來像是帶有嵌入在“ ”識別符號中的指令碼的 HTML 頁面。一個頁面可能包括若干個指令碼。這為指令碼的開發提供了一種非常靈活的方法。例如,如果您喜歡,可以編寫一個正常的 HTML 頁面來建立通用的頁面框架,然後再增加指令碼的內容。

  對於不同的資料庫引擎,PHP 對統一的介面不再作任何事情, DBI 也用這種方法。取而代之,每個引擎的介面看起來非常像相應的實現該引擎低階 API 的 C 庫介面。例如,用於從 PHP 指令碼內部訪問 MySQL 的PHP 函式的名稱非常類似於 MySQL C 客戶庫中函式的名稱。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-949087/,如需轉載,請註明出處,否則將追究法律責任。

相關文章