DBI和DBD有什么区别?

时间:2009-12-24 11:55:35

标签: perl dbi dbd

有人可以了解一下DBI和DBD究竟是什么?什么时候应该使用一个和使用一个优于另一个的好处。

5 个答案:

答案 0 :(得分:20)

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

答案 1 :(得分:15)

来自DBI docs

             |<- 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 driverOracle driver的框是DBD模块。

所以你的代码与DBI对话。 DBI与您的数据库的相应DBD模块进行对话。 DBD模块与您的数据库通信。这导致与不同数据库的单一,一致的接口。

答案 2 :(得分:9)

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

答案 3 :(得分:4)

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

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

答案 4 :(得分: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);