В чем разница между DBI и DBD? - PullRequest
6 голосов
/ 24 декабря 2009

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

Ответы [ 5 ]

20 голосов
/ 24 декабря 2009

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

15 голосов
/ 24 декабря 2009

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

9 голосов
/ 24 декабря 2009

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

4 голосов
/ 25 декабря 2009

DBI обозначает интерфейс базы данных . DBD обозначает драйвер базы данных .

Как программист, вы всегда должны использовать интерфейс (DBI). Интерфейс, в свою очередь, использует драйвер. Причина использования DBI вместо непосредственного использования DBD заключается в том, что он обеспечивает согласованный уровень абстракции для работы с базами данных. Есть много модулей DBD , но вам нужно изучить только один интерфейс. Кроме того, это позволяет относительно легко изменить базу данных, используемую вашим приложением, просто изменив драйвер. Интерфейс такой же. (Синтаксис запроса может быть немного другим.)

1 голос
/ 24 декабря 2009

Используйте их вместе. Например, с 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);
...