hook_update_N
developer/hooks/install.php, строка 202
- Версии
- 5
hook_update_N()
- 6
hook_update_N(&$sandbox = NULL)
Производит обновление таблиц БД, необходимое для единичного обновления модуля.
Для каждого обновления модуля, требующего изменений в схеме базы, создайте отдельный хук hook_update_N()
, который будет вызываться из update.php. Обновления схемы БД нумеруются последовательно, начиная с 1 для каждого модуля. Для модуля mymodule первым обновлением будет mymodule_update_1()
.
Есть смысл удалять из модуля хуки обновлений для очень старых версий Друпала (более чем на две основные версии отличающихся от последней стабильной версии). Друпалу можно сообщить об этих удалениях с помощью хука hook_update_last_removed()
.
Никогда не перенумеровывайте хуки обновления.
Реализации этого хука должны быть в файле mymodule.install
, находящемся в одной директории с файлом модуля mymodule.module
. Друпал реализует свои собственные обновления как хуки модуля system
. Эти обновления находятся в файле database/updates.inc
.
Если возможно, реализуйте обновления для PostgreSQL и MySQL одновременно. Если обновления для PostgreSQL будут добавлены позже, добавьте новую функцию обновления, только для PostgreSQL. В комментариях опишите, какие обновления на самом деле делают одно и то же для разных СУБД.
Следующие примеры дают представление о том, как превратить обновления для MySQL в обновления для PostgreSQL. Обычно (хоть и не всегда!) используются следующие SQL запросы:
- Добавление ключа (индекса)
- Добавление первичного ключа
- Удаление первичного ключа
- MySQL:
ALTER TABLE {$table} DROP PRIMARY KEY
- PostgreSQL:
ALTER TABLE {$table} DROP CONSTRAINT {$table}_pkey
- MySQL:
- Удаление поля
- MySQL:
ALTER TABLE {$table} DROP $column
- Postgres:
ALTER TABLE {$table} DROP $column
- MySQL:
- Удаление индекса
- Добавление поля
- MySQL:
$ret[] = update_sql('ALTER TABLE {vocabulary} ADD tags tinyint(3) unsigned default '0' NOT NULL');
- PostgreSQL:
db_add_column($ret, 'vocabulary', 'tags', 'smallint', array('default' => 0, 'not null' => TRUE));
- MySQL:
- Изменение поля
- MySQL:
$ret[] = update_sql('ALTER TABLE {locales_source} CHANGE location location varchar(255) NOT NULL default ''');
- PostgreSQL:
db_change_column($ret, 'locales_source', 'location', 'location', 'varchar(255)', array('not null' => TRUE, 'default' => ''''));
- MySQL:
Возвращаемое значение
Массив результатов выполнения функций update_sql()
.
Связанные темы
Код
<?php
function hook_update_N() {
$ret = array();
switch ($GLOBALS['db_type']) {
case 'pgsql':
db_add_column($ret, 'contact', 'weight', 'smallint', array('not null' => TRUE, 'default' => 0));
db_add_column($ret, 'contact', 'selected', 'smallint', array('not null' => TRUE, 'default' => 0));
break;
case 'mysql':
case 'mysqli':
$ret[] = update_sql("ALTER TABLE {contact} ADD COLUMN weight tinyint(3) NOT NULL DEFAULT 0");
$ret[] = update_sql("ALTER TABLE {contact} ADD COLUMN selected tinyint(1) NOT NULL DEFAULT 0");
break;
}
return $ret;
}
?>
Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии