Работа с БД в Drupal 7 - урок 1 - drupal db api
Если вы писали модули для 6ой версии Drupal, то для вас не составит труда перейти на новый database API drupal 7. Новый DB API работает на основе расширения php PDO, что дает ему возможность работать на различных базах данных таких как MySQL, PostgreSQL, MSSQL и возможно Oracle. Насчет простоты сказать сложно, к новому синтаксису нужно привыкнуть, писать SQL-запросы куда привычнее.
Вот немного из того что пишут в официальной документации:
Drupal 7 Database API предоставляет стандартный, интуитивно-понятный уровень абстракции для доступа к серверу баз данных. Этот API разработан с сохранением синтаксиса и силы SQL настолько, насколько это возможно, однако также:
- Поддерживает много серверов БД просто;
- Позволяет разработчикам создавать более сложные функции БД, такие как транзакции;
- Предоставляет структурированный интерфейс для динамического построения запросов;
- Обеспечивает проверку обеспечение безопасности и других good practices;
- Предоставляет модулям чистый интерфейс для перехвата и модификации запросов сайта;
Главная документация по database API скроена прямо в комментариях в коде. Раздел handook расширен документацией API в виде введения для авторов модулей, кто желает работать с серверами баз данных хорошо с точки зрения администратора. Handbook может не осветить всех возможностей API.
- Database API был сделан с использованием концепции объектно-ориентированного программирования и этот документ предполагает по крайней мере частичное ознакомление с этой концепцией. Однако, большинство общих операций имеют функциональный вид и разработчики могут выбрать использовать функциональный вид для написания кода.
Главная концепция Drupal Database API
Уровень абстракции баз данных (дальше db layer) в Drupal сделан на основе PHP PDO библиотеки. PDO предоставляет унифицированный, объектно-ориентированный API для доступа к различным БД однако не предоставляет уровень абстракции для различных диалектов языка SQL для различных серверов БД.
Драйверы
Так как различный базы данных требуют различные виды взаимодействий, Drupal db layer требует драйвера для каждого типа БД. Драйвер состоит из серии файлов размещенных в includes/database/driver, где driver это строка представляющая уникальный ключ для этого драйвера. Во многих случаях ключ драйвера это название базы данных в нижнем регистре, такие как "mysql", "pgsql" или "mycustomdriver".
Каждый драйвер состоит из нескольких классов производных от родительских классов в ядре системы БЮ. Эти классы драйверов могут переопределять любое поведение нуждающиеся в правильной поддержке базы данных. Классы драйверов всегда названы как родительский класс следующий за подчеркиванием после именни драйвера в нижнем регистре. Например, для MySQL специфическая версия InsertQuery названа InsertQuery_mysql.
Соединение с БД
Соединение это объект класса DatabaseConnection, который наследуется от PDO класса. Каждая БД к которой присоединяется Drupal имеет одиночное соединение и объект с ним связанный. Объект класса соединения может быть подклассом для каждого индивидуального драйвера.
Для доступа к объекту соединения может быть:
<?php $conn = Database::getConnection($target, $key); ?>
Для доступа к уже текущему активному соединению:
<?php $conn = Database::getConnection(); ?>
И мы получим доступ к активному соединению.
В подавляющем большинстве случаев вы не будете нуждаться в запросе к объекту соединения напрямую. Прежде, оборачивающая процедура сделает это за вас. Единственная причина, если вам нужно выполнить сложные запросы между несколькими базами данных и вы не хотите менять активное соединение с БД.
To set the active connection, use:
Для установки активного соединения используйте:
<?php db_set_active($key); ?>
Запросы к БД
Запрос - это SQL-выражение, которое будет послано через соединение БД. Drupal DB API поддерживает 6 типов запросов к БД: Статический (Static), Динамический (Dynamic), Вставки (Insert), Обновления (Update), Удаления (Delete) и Слияния (Merge). Некоторые запросы написанные как SQL-строка могут быть использованы вместо объектно-ориентированного конструктора запросов. Объект-запрос ссылается на конструктор запросов для выбора одного из типов запроса.
Написание запроса
Объявление объекта происходит как результат запроса SELECT. Это будет всегда тип DatabaseStatement или возможно подкласс от DatabaseStatement. DatabaseStatement расширенный класс от PDOStatement.
Drupal использует готовые объявления для всех запросов. Готовое объявление - это шаблон для запроса в котором значения могут быть вставлены при выполнение. Подразумевая готовые заявления как SQL эквивалент, которые вызывается для использования с параметрами. Обычно в PDO одно явно подготовленное объявление объекта и когда запрос выполняется текущие значения вставляются в указанные места запроса. Это объявление может быть повторно использовано для нового запроса. Фактически объявление и результат это синонимы, однако только после того как объявление запроса будет выполнено.
Drupal не раскрывает подготовленное объявление запроса напрямую. Вместо этого, программист будет использовать объект запроса строку без SQL, с последующим исполнением.