В чем разница между DBI и DBD?

может кто-нибудь, пожалуйста, пролить свет на то, что именно DBI и DBD? Когда следует использовать один из них и преимущества использования одного над другим.

5 ответов


DBI-это библиотека доступа к базе данных, тогда как DBDs - это "драйверы", которые используются DBI для доступа к конкретной базе данных (например. существует один DBD для MySQL, другой для PostgreSQL и т. д.). Вы должны использовать DBI, а не DBDs напрямую.


С 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 разговаривает с вашей базой данных. Это обеспечивает единый интерфейс для различных баз данных.


DBI-это интерфейс. DBD-это реализации этого интерфейса.


DBI означает интерфейс базы данных. ДБР расшифровывается как драйвер базы данных.

в качестве программиста вы всегда должны использовать интерфейс (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 база данных, вы можете быть в состоянии уйти с изменением только до DBI::connect:

$dbh = DBI->connect("dbi:Oracle:host=$host;sid=$sid", $user, $password);