Schema API
Схема БД в Друпале — структурированный массив, представляющий одну или более таблиц, и их связанные ключи и индексы. Схема определяется хуком hook_schema()
, который обычно находится в файле modulename.install
.
Реализовав hook_schema()
и описав в нем таблицы, которые должен создавать модуль, можно легко создавать и удалять эти таблицы во всех поддерживаемых СУБД. Отпадает необходимость работать с разными диалектами SQL для создания или изменения таблиц в поддерживаемых СУБД.
Хук hook_schema()
должен вернуть ассоциативный массив, ключи которого соответствуют таблицам, которые определяет модуль.
Определены следующие ключи:
'description'
: Строка, описывающая эту таблицу и ее назначение. Ссылки на другие таблицы должны быть заключены в фигурные скобки. Например, поле описания таблицыnode_revisions
выглядит так: 'Хранит информацию о заголовке и теле каждой{node}
поревизионно.''fields'
: Ассоциативный массив ('fieldname' => specification
), описывающий столбцы таблицы БД. Спецификация также представляет собой массив. Определены следующие параметры спецификации:
'description'
: Строка, описывающая это поле и его назначение. Ссылки на другие таблицы должны быть заключены в фигурные скобки. Например, описание поляvid
таблицы node может выглядеть так: 'Всегда содержит самое большое (самое релевантное) значение{node_revisions}.vid
для данногоnid
.''type'
: Общий/базовый тип данных:'varchar'
,'int'
,'serial'
'float','numeric'
,'text'
,'blob'
или'datetime'
. Большинство типов просто "указывают" на соответствующе типы данных СУБД. Для автоинкрементных полей используется спецификатор'serial'
, который расширяется до'int auto_increment'
в MySQL.'size'
: Размер данных:'tiny'
,'small'
,'medium'
,'normal'
,'big'
. Это своеобразная подсказка по поводу того, какое самое большое значение будет хранить данное поле, определяющая также, какой из типов данных СУБД будет использоваться (например, в MySQL - TINYINT, INT или BIGINT).'normal'
, значение по умолчанию, определяет базовый тип (например, INT, VARCHAR, BLOB, и т.д. в MySQL).
Не все размеры доступны для различных типов данных. В описании db_type_map()
даны возможные комбинации.
'not null'
: Если true, значенияNULL
в данном столбце будут запрещены. По умолчанию значение false.'default'
: Значение поля по умолчанию. Здесь нужно обратить внимание на следующее:''
,'0'
и 0 - различные значения. Если для поля типа'int'
значением по умолчанию было задано'0'
, это не сработает, поскольку'0'
есть строка, содержащая символ 0, а не целое число.'length'
: Максимальная длина поля типов'varchar'
или'text'
. Для других типов данных игнорируется.'unsigned'
: Булевская переменная, показывающая, является ли один из типов'int'
,'float'
или'numeric'
знаковым или беззнаковым. По умолчанию false. Для остальных типов данных игнорируется.'precision'
,'scale'
: Для полей типа'numeric'
показывает точность (число значащих цифр) и масштаб (десятичные цифры после запятой). Оба значения обязательны. Для остальных типов данных игнорируются.
Все параметры, кроме 'type'
, опциональны, не считая того, что для столбцов типа 'numeric'
должны быть указаны значения 'precision'
и 'scale'
.
'primary key'
: Массив из одного или более спецификаторов ключевых столбцов (см. ниже), которые формируют первичный ключ.'unique keys'
: Ассоциативный массив уникальных ключей ('keyname' => specification
). Каждая спецификация есть массив из одного или более спецификаторов ключевых столбцов (см. ниже), которые формируют уникальный ключ таблицы.'indexes'
: Ассоциативный массив индексов ('indexame' => specification
). Каждая спецификация есть массив из одного или более спецификаторов ключевых столбцов (см. ниже), которые формируют индекс таблицы.
Спецификатор ключевого столбца есть либо строка с именем столбца, либо массив из двух элементов - имени столбца и длины, определяющей префикс данного столбца.
В качестве примера приведем подмножество определения схемы таблицы 'node'
CMS Drupal. Имеется четыре поля ('nid'
, 'vid'
, 'type'
и 'title'
), первичный ключ - поле 'nid'
, уникальный ключ 'vid'
- поле 'vid'
, и два индекса - 'nid'
(поле 'nid'
) и 'node_title_type'
(поле 'title'
и 4 первых байта поля 'type'
):
$schema['node'] = array( 'fields' => array( 'nid' => array( 'type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE ), 'vid' => array( 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0 ), 'type' => array( 'type' => 'varchar', 'length' => 32, 'not null' => TRUE, 'default' => '' ), 'title' => array( 'type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => '' ), ), 'primary key' => array( 'nid' ), 'unique keys' => array( 'vid' => array( 'vid' ) ), 'indexes' => array( 'nid' => array( 'nid' ), 'node_title_type' => array( 'title', array( 'type', 4 ) ), ), );
Смотри также
Функции
Имя | Описание |
---|---|
db_add_field includes/database.mysql-common.inc | Добавляет новое поле в таблицу. |
db_add_index includes/database.mysql-common.inc | Добавляет индекс. |
db_add_primary_key includes/database.mysql-common.inc | Добавляет первичный ключ. |
db_add_unique_key includes/database.mysql-common.inc | Добавляет уникальный ключ. |
db_create_table includes/database.inc | Создает новую таблицу из описания таблицы в нотации Друпала. |
db_create_table_sql includes/database.mysql-common.inc | Генерирует SQL-код для создания новый таблицы из описания схемы Друпала. |
db_drop_field includes/database.mysql-common.inc | Удаляет поле в таблице БД. |
db_drop_index includes/database.mysql-common.inc | Удаляет индекс в таблице БД. |
db_drop_primary_key includes/database.mysql-common.inc | Удаляет первичный ключ. |
db_drop_table includes/database.mysql-common.inc | Удаляет таблицу из БД. |
db_drop_unique_key includes/database.mysql-common.inc | Удаляет уникальный ключ. |
db_field_names includes/database.inc | Return an array of field names from an array of key/index column specifiers. |
db_field_set_default includes/database.mysql-common.inc | Устанавливает значение по умолчанию для поля таблицы БД. |
db_field_set_no_default includes/database.mysql-common.inc | Убирает у поля значение по умолчанию. |
db_last_insert_id includes/database.mysql-common.inc | Возвращает id последнего вставленного ряда. Можно безопасно использовать в thread safe режиме. |
db_rename_table includes/database.mysql-common.inc | Переименовывает таблицу БД. |
db_type_map includes/database.mysql-common.inc | This maps a generic data type in combination with its data size to the engine-specific data type. |
db_type_placeholder includes/database.inc | Given a Schema API field type, return the correct %-placeholder. |
drupal_get_schema includes/common.inc | Возвращает схему определенной таблицы или всей базы данных сайта. |
drupal_get_schema_unprocessed includes/common.inc | Возвращает необработанную и не изменённую версию схемы таблицы модуля. |
drupal_install_schema includes/common.inc | Создаёт все таблицы БД, определённые в реализации hook_schema() модуля. |
drupal_schema_fields_sql includes/common.inc | Извлекает список столбцов таблицы. Этот список может использоваться при составлении SQL-запросов. |
drupal_uninstall_schema includes/common.inc | Удаляет все таблицы, которые модуль описывает в хуке hook_schema(). |
drupal_write_record includes/common.inc | Сохраняет запись в базу данных согласно схеме. |
_db_create_field_sql includes/database.mysql-common.inc | Генерирует SQL-выражение для поля, которое может использоваться при создании или изменении таблицы. |
_db_process_field includes/database.mysql-common.inc | Устанавливает специальные, относящееся к механизму СУБД свойства для поля. |
_drupal_initialize_schema includes/common.inc | Заполняет необходимые значения по умолчанию для определений таблицы, возвращаемых хуком hook_schema(). |