Вы здесь

Обновление таблицы БД, созданной в своем модуле с помощью хука module_schema

0

Добрый день.

Некий модуль создает таблицу с помощью хука module_schema в файле module.install.

А вот каким образом можно потом эту таблицу изменить в процессе, когда уже модуль работает, таблица наполнена какими-то данными и т.д. ?
Я вижу в коде, что вроде бы для этого в module.install есть функции с названиями module_update_ЧИСЛО().
В чем принцип работы этих функций ?
И что означает это число ?

Может быть, например, если число = 7002, то 7 - версия drupal, а 002 - версия модуля, и при установке этой версии эта функция будет отрабатываться ?

Версия Drupal: 
7.x
Вопрос задан 19.01.2016 - 08:01

Ответы

2

Думаю с node.install будет понятно:

/**
 * Upgrade the node type table and fix node type 'module' attribute to avoid name-space conflicts.
 */
function node_update_7000() {
  // Rename the module column to base.
  db_change_field('node_type', 'module', 'base', array('type' => 'varchar', 'length' => 255, 'not null' => TRUE));

  db_add_field('node_type', 'module', array(
    'description' => 'The module defining this node type.',
    'type' => 'varchar',
    'default' => '',
    'length' => 255,
    'not null' => TRUE,
  ));

  db_add_field('node_type', 'disabled', array(
    'description' => 'A boolean indicating whether the node type is disabled.',
    'type' => 'int',
    'not null' => TRUE,
    'default' => 0,
    'size' => 'tiny'
  ));

  $modules = db_select('system', 's')
    ->fields('s', array('name'))
    ->condition('type', 'module');
  db_update('node_type')
    ->expression('module', 'base')
    ->condition('base', $modules, 'IN')
    ->execute();

  db_update('node_type')
    ->fields(array('base' => 'node_content'))
    ->condition('base', 'node')
    ->execute();
}

Может быть, например, если число = 7002, то 7 - версия drupal, а 002 - версия модуля, и при установке этой версии эта функция будет отрабатываться ?

описание хука - https://api.drupal.org/api/drupal/modules!system!system.api.php/function...

  • 1ая цифра - версия ядра.
  • вторая цифра - версия релиза (7.x-1.* (1) или 7.x-2.* (2)). 0 для начала.
  • остальные 2 цифры - инкремент.
Ответ дан 19.01.2016 - 09:23

Я так понимаю, пример с node_update_7000 - это для апгрейда с Drupal 6 на Drupal 7, а не для обновления БД в процессе работы над своим модулем под Drupal 7 ?

И такой вопрос - ситуацию, когда количество релизов у модуля - 10 и более, а количество итераций - 100 и более, разработчики посчитали фантастической и решили её в виду не иметь ?

Комментарий оставлен 19.01.2016 - 14:29

имхо повод подумать, почему так много апдейтов, может лучше сделать заново :)

Комментарий оставлен 19.01.2016 - 15:16

Понятно.
А вот скажите пожалуйста, если, к примеру, я строю не просто таблицу, а таблицу, на базе которой также создаю entity с помощью кода, то модифицировать при необходимости эту таблицу можно таким же образом, через hook_update_N ?

Комментарий оставлен 20.01.2016 - 11:14

да конечно. Вы модифицируете какой-то работающий модуль, с реальными данными?

Комментарий оставлен 20.01.2016 - 12:23
1

Может быть, например, если число = 7002, то 7 - версия drupal, а 002 - версия модуля

7002 это версия схемы базы данных для заданного модуля.
См. SELECT schema_version FROM system WHERE name = 'module_name'.
В документации к hook_update_N подробно написано как этим пользоваться.

Updating tables: hook_update_N() functions

Ответ дан 19.01.2016 - 09:22
Аватар пользователя Chi
Chi
68
0

Ну как дела на фронтах?

Ответ дан 21.01.2016 - 08:08
-1

_update

Ответ дан 19.01.2016 - 12:38