database - DBI 是 Perl 中访问数据库的唯一方法吗

标签 database perl

<分区>

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),并为此编程,并复制 DBDDBI 层。但是,既然已经建立了独立于数据库的接口(interface)及其随附的数据库驱动程序,为什么还要费心呢?

查看 DBIx::Class 的引擎特定部分想象一下,如果我们还没有为每个引擎提供 DBD,将会有多少工作要做。然后,想象一下如果 Rose::DB还必须复制整套驱动程序。

或者,您可以想象,如果每家每户都有自己喜欢的墙上 socket 类型,并且每台电器都有自己喜欢的电源插头,会发生什么情况。每台笔记本电脑都可以有自己的变压器,但我们都受益于可以从中获取电力的标准插头和 socket 。 DBI 处于插头和 socket 级别。

关于database - DBI 是 Perl 中访问数据库的唯一方法吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15938192/

相关文章:

java - 从节点 Firebase-Android 检索所有子节点

c++ - 想要获取perl在c、cpp或.h的多个文件中定义的函数名称

javascript - 如何从 perl 脚本发送准备显示的 html?

perl - Perl 中的子例程重新定义错误

安卓。启动时升级数据库

mysql - 用where条件替换sql

mysql - 添加外键 SQL 违规,Laravel

database - 如何通过 .NET 代码压缩和修复 ACCESS 2007 数据库?

html - Perl HTML::Strip->parse 不会忽略

mysql - 如何将 DBIx::Simple + SQL::Abstract 与 DBIx::Connector 结合使用