2013-04-10 74 views
1

DBI訪問Perl中數據庫的唯一方法嗎?DBI是訪問Perl中數據庫的唯一方式

DBI之外是否還有其他包裝可用於訪問數據庫,如MS-SQL/Oracle/MySQL

+2

http://stackoverflow.com/questions/3419468/perl-modules-mysql-vs-dbi – Prix 2013-04-10 23:24:50

+3

你只是好奇,還是有問題與DBI,你想解決? – Barmar 2013-04-10 23:33:13

+0

只是好奇。我覺得沒有任何東西令人驚訝。如果有人能夠解釋爲什麼沒有可能......那很有趣。 – user632942 2013-04-10 23:36:12

回答

5

有一段時間,試圖想象個人電腦的硬件市場之前 Windows。例如,在那些日子裏,每個應用程序都需要有自己的驅動程序。這意味着如果一臺打印機沒有驅動程序,可以使用WordStarLotus 1-2-3,這在辦公環境中幾乎沒有用處。如果您的打印機可以與這兩種應用程序一起工作,但您現在還想從Harvard Graphics輸出?您需要確保應用程序本身知道如何處理您的特定打印機。

也就是說,ñ應用和中號打印機意味着需要ň × 中號驅動程序。

在Windows環境下,硬件製造商可以爲Windows編寫驅動程序,只要應用程序知道如何通過Windows提供的接口與打印機通信,則無需瞭解特定硬件的任何信息。

這使硬件和軟件都更便宜。具體而言,應用程序員不需要知道存在的特定硬件。而且,在應用程序編寫時並不存在的硬件如果通過相同的驅動程序接口進行通信,仍然可以與應用程序一起使用。

當然,這是一個相當簡化的情況。即使使用DOS,也有ESC/P,PCL,當然還有PostScript,所以它不像每臺打印機都是獨一無二的,但應用程序仍需要了解這些細節。

這裏情況類似。知道如何與DBI交談的Perl應用程序大多不需要關注每個特定數據庫的大部分各種細節。爲Perl程序提供特定的數據庫只需要爲其編寫合適的DBD::*模塊。從DBI documentation下圖說明了這一點:

    |<- Scope of DBI ->| 
        .-. .--------------. .-------------. 
    .-------.  | |---| XYZ Driver |---| XYZ Engine | 
    | Perl |  | | `--------------' `-------------' 
    | script| |A| |D| .--------------. .-------------. 
    | using |--|P|--|B|---|Oracle Driver |---|Oracle Engine| 
    | DBI | |I| |I| `--------------' `-------------' 
    | API |  | |... 
    |methods|  | |... Other drivers 
    `-------'  | |... 
        `-'

一旦DBI是存在的,寫,或使用對於給定的發動機的特定的專用模塊的激勵減小。當然,讓一個獨立的模塊與某個地方的發動機單獨通信可能會有一定的好處,但這些好處必須與成本進行權衡。其應用程序需要數據庫訪問的程序員需要了解不熟悉的API的來龍去脈。如果訪問ABC引擎的唯一方式是通過DBI以外的其他方式訪問,那麼ABC引擎不允許程序員利用他們已知的內容。使用ABC引擎的專用API的應用程序無法與其他引擎一起使用,或者應用程序員必須使用自己的獨立於數據庫的接口並對其進行編程,並將DBD複製到DBI層。但是,如果已經有一個建立的數據庫獨立接口及其伴隨的數據庫驅動程序,爲什麼還要這麼做呢?

看看的DBIx::Class發動機特定部分和想象有更多的工作它本來如果我們沒有已經爲每個引擎的DBD。然後,想象一下,如果Rose::DB也必須重複整套驅動程序。

或者,您可以想象如果每個家庭都有其首選類型的牆上插座並且每個電器都有自己的首選電源插頭,會發生什麼情況。每檯筆記本電腦都可以有自己的變壓器,但我們都可以從標準插頭和插座中獲益,從中可以抽出電力。 DBI位於插件和插座級別。