Распечатать статью

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 ) ),
    ),
  );

 

 

Смотри также

 

drupal_install_schema()

 

Функции

Имя Описание
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().

Источник: drupal.ru

Вы можете оставить комментарий, или обратную ссылку на Ваш сайт.

Оставить комментарий

Похожие статьи