Работа в Drupal с несколькими базами данных. Подключение к бд drupal
Подключение к нескольким базам данных в Drupal
Уровень абстракции баз данных облегчает запоминание имен функций, а, кроме того, еще и обеспечивает защиту запросов. Иногда бывает нужно подключиться к сторонним или унаследованным базам данных, и было бы хорошо использовать для этого — а также для защиты запросов — API-интерфейс баз данных Drupal. И это действительно возможно! Например, модуль может открыть подключение к базе данных вне Drupal и извлечь оттуда данные. В файле settings.php имеется массив $databases, составленный из нескольких строк подключения к базам данных. Вот стандартный синтаксис для описания одного подключения:
array('driver' => 'mysql', 'database' => 'databasename', 'username' => 'username', 'password' => 'password', 'host' => 'localhost', 'port' => 3306, 'prefix' => 'myprefix_', );Предположим, что имеются две базы данных: стандартная (с именем D7) и унаследованная, которая определена ниже:
$databases = array ('default' => array ('default' => array ('driver' => 'mysql', 'database' => 'd7', 'username' => 'username', 'password' => 'userpassword', 'host' => 'localhost', 'port' => '', 'prefix' => '', ), ), 'legacy' => array ('default' => array ('driver' => 'mysql', 'database' => 'legacydatabase', 'username' => 'legacyusername', 'password' => 'legacyuserpassword', 'host' => '122.185.22.1', 'port' => '6060', ), ), );Внимание! Если переключиться на другое подключение к базе данных и попытаться выполнить что-нибудь вроде t("текст"), возникнет ошибка. Функция t() требует выполнения действий с базой данных, а подключение к базе данных остается переключенным даже за пределами области действия кода, где было выполнено это переключение. Так что всегда как можно скорее возвращайте подключение к базе данных в default, и внимательно следите, чтобы не вызвать код, который обращается к базе данных.
books-cms.clan.su
Работа в Drupal с несколькими базами данных
Если вам необходимо на друпал-сайте использовать данные из другой базы (может быть даже с другого хоста), то это достаточно просто сделать. Предоставленные для этого возможности не затрагивают кода ядра и могут быть использованы, как в виде вставок PHP-кода в материалы сайта, так и в собственных модулях и темах.
Находим в папке sites/default файл settings.php.Редактируем его. Вместо строчки
ставим
$db_url = array( 'default'=>'mysql://username:pass@localhost/databasename', 'db1'=>'mysql://username1:pass@host1/databasename1', 'db2'=>'mysql://username2:pass@host2/databasename2',/*** Сколько угодно параметров для требуемого количества баз данных** Индексы кроме 'default' могут быть любыми. */);Теперь если в сниппете, модуле, блоке или материале вам понадобятся данные из других баз, используем следующий код:
/*** Делаем активной базу с параметрами под индексом 'db1'*/db_set_active('db1');$result = db_query("Здесь нужный вам запрос к таблицам в db1")/* ** Здесь обрабатываем результат первого запроса*/// Делаем активной базу с параметрами под индексом 'db2'db_set_active('db2');$result = db_query("Здесь нужный вам запрос к таблицам в db2")/* ** Здесь обрабатываем результат второго запроса*//*** В конце ОБЯЗАТЕЛЬНО делаем активной «родную» базу,** чтобы Drupal мог нормально завершить обработку страницы.*/db_set_active('default');
Переключаться между базами можно сколько угодно раз – после первого обращения Drupal кеширует ресурс соединения с БД в массиве $db_conns и повторного соединения не производится.
Если вам недоступно редактирование файла установок, то можно установить требуемое соединение сразу в PHP-коде:
/*** Получаем глобальные переменные Drupal*/global $db_url;/*** Добавляем свою строку подключения к БД, а родную оставляем под индексом 'default'*/$db_url = array( "default"=>$db_url, "db1"=>"mysql://username1:pass@host1/databasename1");/*** Делаем активной базу с параметрами под индексом 'db1'*/db_set_active('db1');$result = db_query("Здесь нужный вам запрос к таблицам в db1")/* ** Здесь обрабатываем результат запроса*//*** В конце ОБЯЗАТЕЛЬНО делаем активной «родную» базу,** чтобы Drupal мог нормально завершить обработку страницы.*/db_set_active('default');
Указанные решения работают в D5 и D6.
Единственное ограничение – тип баз данных должен быть одним для всех соединений, т.е. следующий код вызовет ошибку:
$db_url = array( 'default'=>'mysqli://username:pass@localhost/databasename', 'db1'=>'pgsql://username1:pass@host1/databasename1',);Вы получите: Cannot redeclare db_status_report() (previously declared in /var/www/mysite/includes/database.mysqli.inc:23) in /var/www/mysite.ru/includes/database.pgsql.inc
Устранить данное ограничение можно только хаком ядра Drupal. Хак получается весьма объемистым. С указанной ошибкой все дело не в функции db_status_report(), а со способом которым Drupal подключает интерфейс требуемого типа баз данных. Дело в том, что названия всех функций (за исключением одной – db_check_setup) находящихся в файлах database.pgsql.inc, database.mysql.inc, database.mysqli.inc и database.mysql-common.inc совпадают, что приводит к конфликту в именах 41 функции. Поэтому использовать несколько подключений к базам разных типов можно только полностью переписав слой абстракции баз данных в Drupal.
Чтобы сделать это откроем все упомянутые файлы в редакторе.
Из файлов database.mysql.inc и database.mysqli.inc удаляем строчку
require_once './includes/database.mysql-common.inc';
Содержимое файла database.mysql-common.inc копируем в файлы database.mysql.inc и database.mysqli.inc, а сам файл делаем пустым.
Далее во всех трех файлах database.pgsql.inc, database.mysql.inc, database.mysqli.inc переименовываем все функции добавляя к их именам постфикс типа базы данных: в файле database.pgsql.inc – _pgsql; в файле database.mysql.inc – _mysql; в файле database.mysqli.inc – _mysqli. Переименовывать не надо только функцию db_check_setup – она уникальна для файла database.pgsql.inc.
Открываем файл database.inc и создаем там 41(!!!) функцию со следующими именами.
Все функции выглядят однотипно, различаясь только названием.
Несомненно, большой объем правок кода ядра может отпугнуть желающих использовать это. Есть еще один способ, требующий меньшего объема кода. Основная проблема в том, что в PHP обычно нет возможности удаления или переопределения (перегрузки) функций. Правда, одно из расширений PHP – Runkit позволяет сделать это. Если runkit п
drupal.ru
Работа с базой данных в Drupal 8
Одним из нововведений Drupal 7 был объектно-ориентированный подход в системе построения запросов к базе данных. Работа системы строилась на таких функциях, как db_select, db_update, db_insert и т.д. Поддерживалось также и прямое написание запросов на основе функций db_query и db_query_range. Основные плюсы данного похода заключаются в отсутствии привязки к определённой СУБД и удобстве поддержки кода. В Drupal 8 все эти функции помечены, как deprecated (с выходом Drupal 9 будут удалены из ядра), и выполнение запросов к базе данных рекомендуется выполнять на основе системы соответствующих классов.
Общие принципы взаимодействия с базой данных в Drupal 8 строятся на получении объекта подключения к текущей базе данных и вызове методов данного объекта для построения конечного запроса и получения результата его выполнения. Получить объект подключения можно с помощью контейнера сервисов (класс Drupal), используя его статический метод database(). После получения объекта подключения нужно получить объект, соответствующий требуемому типу запроса. Как и в седьмой версии, в Drupal 8 построение запроса выполняется на основе таких методов, как fields(), join(), condition() и т. д. Выполнить запрос можно обращением к методу execute().
Выборка
Самый часто используемый способ "общения" с базой данных - это выборка. При разработке модулей не раз приходится сталкиваться с необходимостью получения данных из таблиц контрибных модулей или ядра Drupal. Получить объект SELECT-запроса можно с помощью метода select() из объекта подключения. Рассмотрим примеры основных SELECT-запросов:
1) Простейшая выборка с условием
$query = \Drupal::database()->select('node_field_data', 'nfd'); $query->fields('nfd', ['uid', 'title']); $query->condition('nfd.nid', 1); $result = $query->execute()->fetchAll();В данном примере выполняется выбор значений полей uid и title таблицы node_field_data при условии, что значение в поле nid равно единице. Результат выполнения запроса формируется в виде массива, каждое значение которого будет объектом класса stdClass и будет содержать значения выбранных записей. Добавлять поля в запросе можно также с помощью метода addField(). По умолчанию в методе condition() используется оператор равенства, но можно использовать и другие операторы, передав оператор в качестве третьего параметра.
2) Выборка одного значения
$query = \Drupal::database()->select('node_field_data', 'nfd'); $query->addField('nfd', 'title'); $query->condition('nfd.nid', 1); $result = $query->execute()->fetchField();3) Выборка первой записи
$query = \Drupal::database()->select('node_field_data', 'nfd'); $query->fields('nfd', ['nid', 'title']); $query->condition('nfd.type', 'article'); $result = $query->execute()->fetchAssoc();В переменной $result будет содержаться первая запись результата выборки в виде ассоциативного массива. Для получения записи в виде объекта нужно использовать метод fetchObject().
4) Выборка первой колонки в виде простого массива
$query = \Drupal::database()->select('node_field_data', 'nfd'); $query->addField('nfd', 'title'); $query->condition('nfd.type', 'article'); $result = $query->execute()->fetchCol();В переменной $result будет содержаться одномерный массив, содержащий значения поля title всех выбранных записей.
5) Объединение таблиц в выборке
$query = \Drupal::database()->select('node_field_data', 'nfd'); $query->addField('nfd', 'title'); $query->addField('ufd', 'name'); $query->join('users_field_data', 'ufd', 'ufd.uid = nfd.uid'); $query->condition('nfd.type', 'article'); $result = $query->execute()->fetchAll();6) Выбор определённого диапазона записей
$query = \Drupal::database()->select('node_field_data', 'nfd'); $query->fields('nfd', ['nid', 'title']); $query->condition('nfd.type', 'article'); $query->range(0, 10); $result = $query->execute()->fetchAll();С помощью метода range() можно управлять диапазоном выбираемых записей. Метод имеет два параметра: первый - позиция начала диапазона, второй - количество выбираемых записей с начала диапазона.
7) Использование условий ИЛИ в выборке
$condition_or = new \Drupal\Core\Database\Query\Condition('OR'); $condition_or->condition('nfd.nid', 5); $condition_or->condition('nfd.nid', 7); $query = \Drupal::database()->select('node_field_data', 'nfd'); $query->fields('nfd', ['nid', 'title']); $query->condition($condition_or); $result = $query->execute()->fetchAll();8) Подсчёт числа записей в выборке
$query = \Drupal::database()->select('node_field_data', 'nfd'); $query->fields('nfd', ['nid', 'title']); $query->condition('nfd.type', 'article'); $result = $query->countQuery()->execute()->fetchField();9) Проверка значений на NULL
$query = \Drupal::database()->select('example', 'e'); $query->fields('e'); $query->isNull('e.field_null'); $query->isNotNull('e.field_not_null'); $result = $query->execute()->fetchAll();10) Применение сложных выражений в выборке
$query = \Drupal::database()->select('node_field_data', 'nfd'); $query->fields('nfd', ['nid', 'title']); $query->addExpression("DATE_FORMAT(FROM_UNIXTIME(nfd.created), '%e %b %Y')", 'node_created'); $result = $query->execute()->fetchAll();11) Группировка записей выборки
$query = \Drupal::database()->select('node_field_data', 'nfd'); $query->addField('nfd', 'type'); $query->addExpression('COUNT(*)', 'count'); $query->groupBy('nfd.type'); $result = $query->execute()->fetchAll();12) Применение сложных условий в запросе
$query = \Drupal::database()->select('node_field_data', 'nfd'); $query->fields('nfd', ['nid', 'title', 'type']); $query->where('DAY(FROM_UNIXTIME(nfd.created)) = :day', [':day' => 7]); $result = $query->execute()->fetchAll();Отмечу, что метод where() можно использовать не только в контексте SELECT-запросов. Например, его можно применить в запросе UPDATE или DELETE.
13) Сортировка выбранных записей
$query = \Drupal::database()->select('node_field_data', 'nfd'); $query->fields('nfd', ['nid', 'title', 'type']); $query->orderBy('nfd.title'); $result = $query->execute()->fetchAll();Направление сортировки можно задать посредством второго параметра метода orderBy(), который по умолчанию равен "ASC". Сделать рандомную сортировку можно на основе метода orderRandom().
Вставка и изменение
В случае, когда требуется добавление или изменение данных в определённой таблице, лучше обратиться к Drupal API (если таблица относится к ядру) или API контрибного модуля (если таблица относится к контрибному модулю). Однако, если вы создаёте собственный модуль, который оперирует своими таблицами, то операции добавления и изменения придётся описывать вручную.
Объект UPDATE-запроса получить можно с помощью метода update() из объекта подключения, а объект INSERT-запроса - с помощью метода insert(). Аналогично предыдущему разделу, рассмотрим основные примеры запросов:
1) Обновление записей
$query = \Drupal::database()->update('example'); $query->fields([ 'field_1' => $value_1, 'field_2' => $value_2, 'field_3' => $value_3, ]); $query->condition('field_4', $value_4); $query->execute();В результате выполнения этого кода в таблице example будут обновлены поля field_1, field_2 и field_3 (они получат значения $value_1, $value_2 и $value_3 соответственно) для записей, в которых поле field_4 равно $value_4.
2) Применение сложных выражений при обновлении
$query = \Drupal::database()->update('example'); $query->expression('field_1', 'field_1 + :amount', [':amount' => 100]); $query->expression('field_3', 'field_2'); $query->execute();Если нужно применить сложное выражение для обновления данных, то следует использовать метод expression(). Он содержит три параметра - обновляемое поле, выражение, аргументы для выражения. В данном примере для всех записей численное поле field_1, будет увеличено на 100, а поле field_3 получит значения из field_2.
3) Добавление одной записи
$query = \Drupal::database()->insert('example'); $query->fields([ 'field_1' => $value_1, 'field_2' => $value_2, 'field_3' => $value_3, ]); $query->execute();Стоит отметить, что метод fields() может принимать один или два параметра. Если первый параметр - ассоциативный массив, то ключи массива должны соответствовать полям таблицы, а значения - добавляемым значениям. В этом случае второй параметр опускается. Если первый параметр обычный массив, то он соответствует полям таблицы и нужно передать второй параметр, который должен содержать добавляемые значения в порядке, соответствующем порядку полей в первом параметре. Если второй параметр опущен, добавляемые значения нужно передать на основе метода values().
4) Добавление нескольких записей
$values = [ [$value_1, $value_2, $value_3], [$value_4, $value_5, $value_6], [$value_7, $value_8, $value_9], ]; $query = \Drupal::database()->insert('example'); $query->fields(['field_1', 'field_2', 'field_3']); foreach ($values as $record) { $query->values($record); } $query->execute();5) Добавление или обновление в зависимости от наличия записи
$query = \Drupal::database()->upsert('example'); $query->fields(['field_id', 'field_1']); $query->values([$id, $value_1]); $query->key('field_id'); $query->execute();Часть бывают случаи, что в зависимости от контекста нужно либо обновить запись, либо добавить новую. Реализация предварительного SELECT-запроса проверки наличия записи с дальнейшей условной конструкцией - это плохой тон. В Drupal 8 для этого имеется объект UPSERT-запроса (в Drupal 7 кстати такого типа запросов нет). Получить этот объект можно с помощью метода upsert(). Объект UPSERT-запроса обязательно должен содержать ключевое поле, по которому будет выполняться проверка существования записи. Поле должно быть уникальным в рамках таблицы. Добавить ключевое поле можно вызовом метода key().
Относительно обновления и добавления записей стоит ещё сказать, что метод execute() в случае операции обновления возвращает количество обновлённых записей, а в случае операции добавления - идентификатор добавленной записи, при условии, что добавлялась одна запись. Если добавлялось множество записей, возвращаемый идентификатор не определён.
Удаление
Иногда записи нужно и удалять. В случае таблиц модулей или ядра также следует использовать только соответствующее API. Ну, а для удаления данных из своих таблиц смело используйте объект DELETE-запроса, который, как вы, наверное, догадались, можно получить с помощью метода delete().
$query = \Drupal::database()->delete('example'); $query->condition('field', $value); $query->execute();Построение условий для запроса удаления идентично построению для запросов выборки и изменения (можно использовать проверку на NULL, сложные выражения и т.д.), а метод execute() возвращает количество удалённых записей.
В виде заключения
В общем и целом структура построения запросов к базе данных в Drupal 8 не сильно изменилась относительно Drupal 7. Однако появились некоторые приятные и удобные вещи (например, запрос UPSERT). К слову, когда у вас не получается составить нужный запрос на основе объектной модели, вы всегда можете на свой страх и риск (если вы плохой SQL-щик) выполнить прямой запрос к базе данных с помощью метода query() объекта подключения. Метод в качестве входных параметров может принимать строку с запросом к базе данных.
Материалы для изучения
- Основные отличия в построении запросов к БД между Drupal 8 и Drupal 7
- Обзор Drupal 8 Database API
- Drupal 8 - запросы к базе данных
drupal-coder.ru
Работаем с базой данных в Drupal 7 с помощью Database API
Выборка данных (SELECT запросы)
Для создания SELECT запросов в Drupal 7 используется функция db_select().
Рассмотрим примеры:
Простой запрос выборки nid и title из таблицы node где nid >= 5.
//SQL запрос SELECT n.nid, n.title FROM node n WHERE n.nid >= 5 //php код $query = db_select('node', 'n'); $query->fields('n', array('nid', 'title')); $query->condition('n.nid', 5, '>='); $result = $query->execute();Получение количества записей в таблице node где nid > 10.
//SQL запрос SELECT COUNT(*) FROM node n WHERE n.nid > 10 //php код $query = db_select('node', 'n'); $query->fields('n'); $query->condition('n.nid', 10, '>'); $result = $query->execute()->rowCount();Запрос с одним логическим оператором AND и оператором LIKE
//SQL запрос SELECT n.nid, n.title FROM node n WHERE n.nid >= 5 AND n.title LIKE 'Chapter%' //php код $query = db_select('node', 'n'); $query->fields('n', array('nid', 'title')); $query->condition('n.nid', 5, '>='); $query->condition('n.title', 'Chapter%', 'LIKE'); $result = $query->execute();Запрос c использованием логического оператора OR
//SQL запрос SELECT n.nid, n.title FROM node n WHERE n.nid = 10 OR n.nid = 20 //php код $query = db_select('node', 'n'); $query->fields('n', array('nid', 'title')); $or = db_or(); $or->condition('n.nid', 10); $or->condition('n.nid', 20); $query->condition($or); $result = $query->execute();Запрос c использованием оператора BETWEEN
//SQL запрос SELECT n.nid, n.title FROM node n WHERE n.nid BETWEEN 1 AND 10 //php код $between = array(1, 10); $query = db_select('node', 'n'); $query->fields('n', array('nid', 'title')); $query->condition('n.nid', $between, 'BETWEEN'); $result = $query->execute();Запрос c использованием оператора IN
//SQL запрос SELECT n.nid, n.title FROM node n WHERE n.nid IN (1, 5, 10, 11) //php код $in = array(1, 5, 10, 11); $query = db_select('node', 'n'); $query->fields('n', array('nid', 'title')); $query->condition('n.nid', $in, 'IN'); $result = $query->execute();Запрос c использованием оператора объединения LEFT JOIN и оператора IS NULL
//SQL запрос SELECT n.title FROM node n LEFT JOIN field_data_field_city fc ON fc.entity_id = n.nid WHERE fc.field_city_value IS NULL //php код $query = db_select('node', 'n'); $query->fields('n', array('title')); $query->leftJoin('field_data_field_city', 'fc', 'fc.entity_id = n.nid'); $query->isNull('fc.field_city_value'); $result = $query->execute();Запрос c использованием оператора объединения INNER JOIN
//SQL запрос SELECT u.name, n.title FROM node n INNER JOIN users u ON u.uid = n.uid WHERE u.uid = 1 //php код $query = db_select('node', 'n'); $query->fields('u', array('name')); $query->fields('n', array('title')); $query->innerJoin('users', 'u', 'u.uid = n.uid'); $query->condition('u.uid', 1); $result = $query->execute();В случае сложных условий можно использовать метод where как в следующем примере
//SQL запрос SELECT n.title FROM node n WHERE FROM_UNIXTIME(n.created) < CURDATE() - INTERVAL 1 DAY //php код $query = db_select('node', 'n'); $query->fields('n', array('title')); $query->where('FROM_UNIXTIME(:created) < CURDATE() - INTERVAL 1 DAY', array(':created' => $timestamp)); $result = $query->execute();Запрос с использованием функции агрегации SUM с группировкой
//SQL запрос SELECT SUM(vv.value) AS vote_sum, vv.entity_id, n.title FROM votingapi_vote vv INNER JOIN node n ON n.nid = vv.entity_id GROUP BY n.nid //php код $query = db_select('votingapi_vote', 'vv'); $query->addExpression('SUM(vv.value)', 'vote_sum'); $query->fields('vv', array('entity_id')); $query->fields('n', array('title')); $query->innerJoin('node', 'n', 'n.nid = vv.entity_id'); $query->groupBy('n.nid'); $result = $query->execute();Запрос с использованием подзапроса (subquery)
//SQL запрос SELECT n.title FROM node n WHERE n.nid IN (SELECT ct.nid FROM custom_table ct) //php код $query = db_select('node', 'n'); $query->fields('n', array('title')); $subquery = db_select('custom_table', 'ct'); $subquery->fields('ct', array('nid')); $query->condition('n.nid', $subquery, 'IN'); $result = $query->execute();Запрос с использованием оператора LIMIT
//SQL запрос SELECT n.title FROM node n LIMIT 2, 10 //php код $query = db_select('node', 'n'); $query->fields('n', array('title')); $query->range(2, 10); $result = $query->execute();Для получаения даных из результирующего набора можно использовать следующие функции:
fetchField($index = 0) - получение значения поля с индексом $index.
Эта функция часто используется для получения данных из запроса который возвращает только одну запись.
Пример использования:
$field_value = $result->fetchField();fetchAssoc() - получение записи в виде ассоциативного массива
Пример использования:
$row = $result->fetchAssoc();fetchObject() - получение записи в виде объекта
Пример использования:
$row = $result->fetchObject();fetchAllKeyed($key_index = 0, $value_index = 1) - получение ассоциативного массива в котором ключем является поле с индексом $key_index, а значением поле с индексом $value_index. Массив формируется путем обхода всех записей. Обычно используется для запросов возвращающих только два поля.
Пример использования:
$result_array = $result->fetchAllKeyed(1, 0);rowCount() - получения количества записей
Пример использования:
$count = $result->rowCount();Также все записи можно обойти используя оператор цикла foreach при этом записи будут вытягиваться в виде объектов
Пример использования:
foreach ($result as $row) { //какие-то действия }Добавление записи (INSERT запросы)
Для добавления записей используется функция db_insert() .
Пример:
Добавление новой записи в таблицу node
//SQL запрос INSERT INTO node (title, uid, type) VALUES ('New node', 1, 'article') //php код db_insert('node') ->fields(array( 'title' => 'New node', 'uid' => 1, 'type' => 'article', )) ->execute();Обновление записи (UPDATE запросы)
Для обновления записей используется функцияdb_update().
Примеры:
Обновление записи в таблице node где nid = 1
//SQL запрос UPDATE node SET title = 'Updated', changed = 1363104629 WHERE nid = 1 //php код $query = db_update('node'); $query->fields(array( 'title' => 'Updated', 'changed' => REQUEST_TIME, )); $query->condition('nid', 1); $num_updated = $query->execute();Обновление всех полей title в таблице node где nid > 10
//SQL запрос UPDATE node SET title = CONCAT(title, '(updated)') WHERE nid > 10 //php код $query = db_update('node'); $query->expression('title', 'CONCAT(title, :suffix)', array(':suffix' => ' (updated)')); $query->condition('nid', 10, '>'); $num_updated = $query->execute();Удаление записи (DELETE запросы)
Для удаления записей используется функцияdb_delete().
Пример:
Удаление всех записей из таблицы node где nid > 10
//SQL запрос DELETE FROM node WHERE nid > 10 //php код $query = db_delete('node'); $query->condition('nid', 10, '>'); $num_deleted = $query->execute();drupal-learning.com
Определение параметров базы данных - CMS Drupal 7 РУКОВОДСТВО ПО РАЗРАБОТКЕ СИСТЕМЫ УПРАВЛЕНИЯ ВЕБ-САЙТОМ
Работа Drupal зависит от базы данных. Контент, комментарии, таксономия, меню, пользователи, роли, права доступа и почти все остальное хранится в базе данных и используется в Drupal в качестве источника информации, необходимой для отображения контента на сайте и управления доступом к различным его аспектам. Внутри Drupal имеется облегченный уровень абстракции баз данных — между кодом и самой базой данных. Этот уровень абстракции устраняет значительную часть сложностей взаимодействия с базой данных и защищает Drupal от различий между механизмами разных СУБД. В данной главе вы узнаете, как работает уровень абстракции баз данных и как его использовать. Вы увидите, как модули могут изменять запросы. И, наконец, вы научитесь с помощью API-интерфейса схемы Drupal вставлять в файл .install модуля запросы, необходимые для создания и изменения таблиц базы данных.
Определение параметров базы данных
Drupal узнает, к какой базе данных подключаться и какие имя пользователя и пароль использовать для установления соединения с базой данных, из файла settings.php для конкретного сайта. Этот файл обычно находится по пути sites/example.com/settings.php или sites/default/settings.php. Код, который определяет подключение к базе данных, выглядит примерно так:
$databases = array ('default' => array ('default' => array ('driver' => 'mysql', 'database' => 'имя_базы_данных', 'username' => 'Имя_пользователя', 'password' => 'пароль', 'host' => 'localhost', 'port' => '', 'prefix' => '', ), ), );Этот пример предназначен для СУБД MySQL. Пользователи PostgreSQL вставят в начало строки подключения не mysql, а pgsql. Конечно, указанные здесь имя базы данных, пользовательское имя и пароль должны быть актуальными для вашей базы данных. Это полномочия для доступа к базе данных, а не к Drupal, и они задаются при создании учетной записи базы данных с помощью средств СУБД. Инсталлятор Drupal спрашивает имя и пароль пользователя, чтобы поместить их в массив $databases в файле settings.php. Если для сайта в качестве СУБД используется sqlite, то настройка несколько упрощается. В качестве драйвера следует указать sqlite, а база данных задается путем, включающим имя базы данных:
$databases['default']['default'] = array('driver' => 'sqlite', 'database' => '/path/to/databasefilename', );books-cms.clan.su