сброс статуса hook_update_n модуля

14

Я расширяю модуль, который я написал ранее, и мне нужны некоторые изменения схемы, которые я реализую hook_update_N.

Я обновил версию модуля 7.x-1.0до 7.x-1.1и реализовал, foo_update_7100и она работает нормально.

Проблема в том, что я допустил ошибку внутри, foo_update_7100и теперь, когда я исправил ее, я не могу перезапустить обновление 7100. Мне нужно создать 7101, но это не имеет смысла, потому что все мои изменения еще не зафиксированы.

Я попытался сбросить статус hook_update_n через:

update system set schema_version=-1 where name='foo';

> Query OK, 1 row affected (0.01 sec)
> Rows matched: 1  Changed: 1  Warnings: 0

Тогда я делаю, drush cc allно drush updatedb -yвсе равно выдает мне «Обновления базы данных не требуются».

Как я могу решить это вместо простого увеличения hook_update_Nчисла?

cherouvim
источник
1
Попробуйте установить его в 0, а не -1.
Энди
Благодарю. Это сработало. Я должен был увидеть описание столбца, в котором четко упоминается, что -1означает, что модуль не установлен. Не стесняйтесь опубликовать это как ответ, чтобы я мог принять.
Черувим

Ответы:

14

Установка его в 0 должна работать. system_schema()говорит, что значение должно быть:

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

Энди
источник
1
На самом деле, это будет работать только в том случае, если это единственный хук обновления; обычно это приводит к повторному запуску всех хуков обновления. Безопаснее установить значение на 1 ниже номера перехвата обновления, который необходимо перезапустить (и любые перехваты с последующими номерами также будут работать).
Eelke Blok
Есть ли причина , по которой -1будет отображаться для модуля , который Drupal говорит будет включен?
cdmo
6

К вашему сведению, в Drupal 8 системная таблица была удалена, и эта информация теперь сохраняется в таблице key_value .

UPDATE key_value SET value='i:8000;' WHERE collection = 'system.schema' AND name = 'module_name';

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

micahw156
источник
3

Я сделал это так много, что закончил тем, что написал модуль drush для отката версии обновления в системной таблице. Вызывается «uroll» для отката обновления.

https://github.com/danshumaker/drush-uroll

Использование: drush uroll --module = mycustommodule --version = 5

Это очень просто, но я использую это все время. Это в сочетании со сценарием перезагрузки резервной копии базы данных позволяет промывать и повторять при написании функций обновления.

Надеюсь, полезно для вас. Удачи.

Дэн Шумейкер
источник
Потрясающие! Друпал 7 или Друпал 8?
Игнасио Сегура Постиго
1
D7 только пока.
Дэн
Это хорошо. Помог мне. Просто для пояснения, если мой hook_update_N похож на mymodule_update_7000, то в вашей команде drush uroll для версии я могу поставить 0. Я прав?
Остин
1
@Kamal Извините, мне лучше документировать. Если текущий хук, который вы записываете hook_update_N, равен 7300, то вы дадите uroll, --module=mymodule --version=7299 которая устанавливает таблицу sys на единицу раньше вашей. Таким образом, на следующем дубле ваш 7300 будет запущен. Так что, нет, не просто дайте ему последние две цифры, но и целое число, mymodule_update_независимо от того, что это может быть 9123667 .. :) @Eelke также имеет хорошее описание в своем ответе.
Дэн Шумейкер
0

Чтобы ваш хук обновления снова запустился, вам нужно установить schema_version на 1 ниже порядкового номера вашего хука .

Технически, все, что ниже ловушки, которую вы хотите перезапустить, и выше ловушки обновления, которую вам не нужно / не нужно перезапускать (но по крайней мере 0; -1 означает, что модуль не установлен), в порядке; если нет других ловушек обновления, это означает, что даже 0 попадает между этими границами, но в типичном случае ловушки обновления увеличиваются на единицу, поэтому только снижение на 1 является единственным безопасным вариантом, если вы не хотите запускать больше кода чем текущий максимальный хук обновления.

Процесс обновления просто проверяет это значение и проверяет, есть ли какие-либо ловушки обновления с более высоким порядковым номером. Если это так, он будет запускать их в последовательности. (Это также означает, что в процессе установки устанавливается версия схемы, соответствующая самой высокой из доступных ловушек обновления; предполагается, что после установки ваш модуль будет иметь состояние, соответствующее этой последней ловушке обновления).

Элке Блок
источник