请问DBI和DBD是什么?何时应该使用其中之一,以及使用其中一个与另一个相比的好处,你能为我解答一下吗?
DBI是一个数据库访问库,而DBDs则是由DBI用来访问特定数据库的“驱动程序”(例如,MySQL有一个DBD,PostgreSQL有另一个)。你应该直接使用DBI而不是使用DBDs。
来自 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模块与你的数据库通信。这样就可以为不同的数据库提供单一、一致的接口。
DBI是接口。DBD是该接口的实现。
DBI代表数据库接口。DBD代表数据库驱动程序。
作为一名程序员,您应该始终使用接口(DBI)。接口反过来又使用驱动程序。使用DBI而不是直接使用DBD的原因是它提供了一个一致的抽象层来处理数据库。有许多DBD模块,但您只需要学习一个接口。此外,这使得通过简单更改驱动程序来更改应用程序使用的数据库相对容易。接口是相同的。(查询语法可能略有不同。)
将它们一起使用。例如,与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);