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} ADD KEY $column ($column)
  • PostgreSQL: CREATE INDEX {$table}_$column_idx ON {$table}($column). Обратите внимание на суффикс _idx
Добавление первичного ключа
  • MySQL: ALTER TABLE {$table} ADD PRIMARY KEY $column ($column)
  • PostgreSQL: ALTER TABLE {$table} ADD PRIMARY KEY ($column)
Удаление первичного ключа
  • MySQL: ALTER TABLE {$table} DROP PRIMARY KEY
  • PostgreSQL: ALTER TABLE {$table} DROP CONSTRAINT {$table}_pkey
Удаление поля
  • MySQL: ALTER TABLE {$table} DROP $column
  • Postgres: ALTER TABLE {$table} DROP $column
Удаление индекса
  • MySQL: ALTER TABLE {$table} DROP INDEX $index
  • PostgreSQL:
    • DROP INDEX {$table}_$column_idx (если индекс был создан с помощью CREATE INDEX)
    • ALTER TABLE {$table} DROP CONSTRAINT {$table}_$column_key (если индекс был создан с помощью UNIQUE($column))
Добавление поля
  • 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:
    $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' => ''''));

Возвращаемое значение

Массив результатов выполнения функций 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;
}
?>
Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Вход в систему