Почему обновление крючка N не запущено?


Я переношу модуль на Drupal 7. Модуль имеет функции hook_update_N(), вызываемые из hook_install(). Есть несколько запросов на вставку, выполненных внутри одной из функций hook_update_N(). Но моя функция hook_update_N не запущена. Есть ли какой-либо способ явного вызова функций hook_update_N?

Я знаю, что мой вопрос почти такой же, как этот Как заставить hook_install() запускать все hook_update_N()?. Но я не понимаю, как называется hook_update_N(). Я запустил обновления на своем сайте Drupal, который, как я думаю, также запускайте обновления пользовательских модулей, но, похоже, hook_update_N() не запускается. Потому что я добавил функцию error_log() внутри hook_update_N(), но файл журнала пуст.

 7
Author: Community, 2012-04-11

5 answers

Drupal хранит, какие крючки обновления были запущены, так как он запускает крючки обновления только один раз. Если конкретный крюк обновления не запускается, наиболее вероятными причинами являются

  • Он уже запущен
  • Крючок обновления, который необходимо запустить до сбоя.

В системной таблице вы можете увидеть все включенные модули, а schema_version показывает, какое обновление было запущено последним.

 6
Author: googletorp, 2012-04-11 17:03:13

Еще одна причина, по которой не запускается хук обновления, - несоответствие между именем хука обновления и основным номером выпуска модуля (см. Файл .info).

Например: крючок обновления mymodule_update_7001 не запускается, если версия модуля 7.x.1.0. В таком случае вы должны переименовать крючок в mymodule_update_7101.

Смотрите документацию по API hook_update

 12
Author: batigolix, 2016-09-02 19:52:12

У меня возникла проблема, когда я установил новый модуль, но установка не удалась. Значение schema_version осталось на уровне -1, что предотвратило дальнейшие обновления для этого модуля. Установка версии на 0 исправила это.

Для любопытных я перенес схему существующей таблицы в новый модуль. Сбой произошел, когда он не смог создать существующую таблицу, чего я и ожидал. Модуль был включен, как и ожидалось, но я не понял, что schema_version не обновлялся.

 2
Author: jgreep, 2016-04-07 22:44:40

Одна из причин, по которой функция hook_update_N() ничего не сделает, заключается в том, что обновление с тем же или большим номером (чем номер, который вы использовали в своей функции hook_update_N()) уже запущено.

Вы можете увидеть номер последнего обновления, запущенного для вашего модуля, запросив таблицу "система" в Drupal 7. "schema_version" - это столбец в таблице "система", в котором хранится номер версии последнего обновления, примененного к вашему модулю. Чтобы ваша новая функция hook_update_N() работала, число (N), которое вы использование на нем должно быть больше, чем число, которое в настоящее время хранится в столбце "schema_version" для этого модуля.

Я использовал следующий запрос в командной строке MySQL (после первого ввода команды "использовать" для указания имени моей базы данных Drupal 7).

Mysql> выберите имя, тип, статус, schema_version из системы, где тип = "модуль" и имя = "имя_модуля";

Столбец "schema_version" будет содержать номер. Число, которое вы используете в своей новой функции обновления, должно быть больше, чем тот.

 1
Author: Anthony Fournier, 2016-09-13 13:17:02

У меня только что была эта проблема, и я подумал, что добавлю ее в кучу, так как не вижу упоминания об этом в других ответах.

Моя проблема была с Drupal 8.7, и проблема заключалась в том, что в имени модуля были прописные символы, из-за чего он не выполнял никаких проверок на наличие обновлений. Например: myModule.

Причина в том, что drupal_get_schema_versions() имеет статический массив $updates, который представляет собой ассоциативный массив доступных версий схемы обновления, помеченных именами модулей. Но все названия модулей написаны в нижнем регистре. Например $updates['mymodule']. Этот приводит к сбою логики и ничего не возвращает, заставляя Drupal думать, что обновлений нет.

 1
Author: Beebee, 2019-10-17 15:34:14