Как при обновлении версии модуля создать таблицу в базе данных
Вот столкнулся с задачей: есть модуль, к которому необходимо написать обновление так, чтобы в следующей версии была добавлена новая таблица в базе данных. Drupal, как обычно, не подкачал и даже порадовал готовой функцией.
Обновление модуля осуществляется через .install файл. Для начала необходимо в
описать таблицу. Например, вот так:hook_schema()
- /**
- * Implements hook_schema().
- */
- function MY_MODULE_schema() {
- $schema = array();
-
- $schema['new_table'] = array(
- 'description' => 'Stores information about Instagram accounts, categories, node relations.',
- 'fields' => array(
- 'aid' => array(
- 'type' => 'serial',
- 'unsigned' => TRUE,
- 'not null' => TRUE,
- 'description' => 'Account ID.',
- ),
- 'username' => array(
- 'type' => 'varchar',
- 'length' => 64,
- 'not null' => TRUE,
- 'default' => '',
- 'description' => 'Instagram account username.',
- ),
- 'entity_type' => array(
- 'type' => 'varchar',
- 'length' => 32,
- 'not null' => TRUE,
- 'default' => '',
- 'description' => 'Entity type to which Instagram account attached.',
- ),
- 'entity_id' => array(
- 'type' => 'int',
- 'not null' => TRUE,
- 'default' => 0,
- 'description' => 'Entity id to which Instagram account attached.',
- ),
- ),
- 'primary key' => array('aid'),
- );
-
- return $schema;
- }
Обновления для модуля указываются в имплементации хука hook_update_N()
. Логика обновлений довольно простая:
- версия любого модуля хранится в таблице system базы данных;
- при запуске обновления (через update.php, например), Drupal обрабатывает все
и, если находит имплементации, где N больше версии, хранящейся в БД, запускает обновление;hook_update_N()
- если же модуль устанавливается с нуля, то
не запускается, хоть в таблице system и устанавливается самая последняя версия - необходимо это учитывать при разработке.hook_update_N()
Итак, пусть это будет первым обновлением для нашего модуля. Тогда код функции будет выглядеть так:
- /**
- * Implements hook_update_N().
- */
- function MU_MODULE_update_7100() {
- $instagram_tables = drupal_get_schema_unprocessed('MY_MODULE');
- foreach ($instagram_tables as $name => $table) {
- db_create_table($name, $table);
- }
- }
Функиця
возвращает информацию о еще не созданных таблицах, описанных в указанном модуле. Обратите внимание, что приведенный код также обработает случай, когда таблиц будет несколько.drupal_get_schema_unprocessed()
Вот такое быстрое и красивое решение на случай обновления модулей.
Комментарии
Плохой тон в hook_update_N использовать данные из hook_schema - schema может измениться, что поломает логику обновлений. Правильно делать так:
/**
* Implements hook_update_N().
*/
function MU_MODULE_update_7100() {
db_create_table('new_table', array(/* копи-паст из hook_schema */));
}
ну и плюс нумерацию апдейтов начинается с 1.
7100 это для модулей, который мигрируют с прошлой мажорной версии.
Добавить комментарий