2013-04-10 73 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位于插件和插座级别。