9

有人可以解释一下 DBI 和 DBD 到底是什么吗?什么时候应该使用其中一种,以及使用其中一种的好处。

4

5 回答 5

21

DBI 是数据库访问库,而 DBD 是 DBI 用来访问特定数据库的“驱动程序”(例如,有一个 DBD 用于 MySQL,另一个用于 PostgreSQL 等)。您应该直接使用 DBI 而不是 DBD。

于 2009-12-24T12:16:04.433 回答
18

来自DBI 文档

               │←−−  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
  └─────────┘         │   ├── ∙∙∙
                      └───┘

标有XYZ Driver和的框Oracle Driver是 DBD 模块。

所以你的代码与 DBI 对话。DBI 与您的数据库的适当 DBD 模块对话。DBD 模块与您的数据库对话。这为不同的数据库提供了一个单一的、一致的接口。

于 2009-12-24T18:50:31.967 回答
9

DBI 是接口。DBD 是该接口的实现。

于 2009-12-24T12:00:59.620 回答
4

DBI 代表数据库接口。DBD 代表数据库驱动程序

作为程序员,您应该始终使用接口 (DBI)。反过来,该接口使用驱动程序。使用 DBI 而不是直接使用 DBD 的原因是它为处理数据库提供了一致的抽象层。DBD 模块有很多,但你只需要学习一个接口。此外,这使得通过简单地更改驱动程序来更改应用程序使用的数据库变得相对容易。界面是一样的。(查询语法可能有点不同。)

于 2009-12-25T02:36:13.553 回答
1

一起使用它们。例如,使用MySQL

use DBI;

$dsn = "DBI:mysql:database=$database;host=$hostname;port=$port";
$dbh = DBI->connect($dsn, $user, $password);

$sth = $dbh->prepare("SELECT * FROM foo WHERE bla");
$sth->execute;

相反,如果您正在与Oracle数据库交谈,您可能只需将$data_source参数更改为DBI::connect

$dbh = DBI->connect("dbi:Oracle:host=$host;sid=$sid", $user, $password);
于 2009-12-24T20:34:49.247 回答