<分区>
DBI
是在 Perl 中访问数据库的唯一方法吗?
除了 DBI
之外,是否还有其他可用的包装器可用于访问 MS-SQL/Oracle/MySQL
等数据库。
<分区>
DBI
是在 Perl 中访问数据库的唯一方法吗?
除了 DBI
之外,是否还有其他可用的包装器可用于访问 MS-SQL/Oracle/MySQL
等数据库。
最佳答案
试想一下 Windows 之前的个人计算机硬件市场。例如,在那些日子里,每个应用程序都需要有自己的驱动程序。这意味着如果一台打印机没有同时支持 WordStar 的驱动程序和 Lotus 1-2-3 ,它在办公环境中几乎没用。如果您有一台可以同时使用这两个应用程序的打印机,但您现在想要来自 Harvard Graphics 的输出怎么办?还有吗?您需要确保应用程序本身知道如何处理您的特定打印机。
也就是说,N 个应用程序和 M 个打印机意味着需要 N×M 个驱动程序。
有了 Windows,硬件制造商可以为 Windows 编写驱动程序,只要应用程序知道如何通过 Windows 提供的接口(interface)与打印机通信,它就不需要知道有关特定硬件的任何信息。
这使得硬件和软件都更便宜。具体来说,应用程序程序员不需要对现有的特定硬件了解那么多。而且,在编写应用程序时不存在的硬件仍然可以与应用程序一起使用,前提是它们都通过相同的驱动程序接口(interface)进行通信。
当然,这是一个相当简化的情况。即使使用 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
存在,为给定引擎编写或使用特定专用模块的动机就会减少。当然,拥有一个单独的模块来单独与某处的 ABC
引擎通信可能有一定的好处,但必须权衡这些好处和成本。其应用程序需要访问数据库的程序员需要了解一个不熟悉的 API 的来龙去脉。如果访问 ABC
引擎的唯一方法是通过 DBI
以外的东西,那么 ABC
引擎不允许程序员利用他们已经拥有的东西知道。要么使用 ABC
引擎的专用 API 的应用程序变得无法与其他引擎一起使用,要么应用程序程序员必须使用她自己的数据库独立接口(interface),并为此编程,并复制 DBD
到 DBI
层。但是,既然已经建立了独立于数据库的接口(interface)及其随附的数据库驱动程序,为什么还要费心呢?
查看 DBIx::Class 的引擎特定部分想象一下,如果我们还没有为每个引擎提供 DBD
,将会有多少工作要做。然后,想象一下如果 Rose::DB还必须复制整套驱动程序。
或者,您可以想象,如果每家每户都有自己喜欢的墙上 socket 类型,并且每台电器都有自己喜欢的电源插头,会发生什么情况。每台笔记本电脑都可以有自己的变压器,但我们都受益于可以从中获取电力的标准插头和 socket 。 DBI
处于插头和 socket 级别。
关于database - DBI 是 Perl 中访问数据库的唯一方法吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15938192/