有人可以了解一下DBI和DBD究竟是什么?什么时候应该使用一个和使用一个优于另一个的好处。
答案 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 driver
和Oracle 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);