Я расширяю модуль, который я написал ранее, и мне нужны некоторые изменения схемы, которые я реализую 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
числа?
-1
означает, что модуль не установлен. Не стесняйтесь опубликовать это как ответ, чтобы я мог принять.Ответы:
Установка его в 0 должна работать.
system_schema()
говорит, что значение должно быть:источник
-1
будет отображаться для модуля , который Drupal говорит будет включен?К вашему сведению, в Drupal 8 системная таблица была удалена, и эта информация теперь сохраняется в таблице key_value .
(Как отмечено выше, фактическое значение должно быть меньше, чем hook_update_N (), который вы хотите повторить, но должно быть больше или соответствовать последнему обновлению, которое не нужно повторять.)
источник
Я сделал это так много, что закончил тем, что написал модуль drush для отката версии обновления в системной таблице. Вызывается «uroll» для отката обновления.
https://github.com/danshumaker/drush-uroll
Использование: drush uroll --module = mycustommodule --version = 5
Это очень просто, но я использую это все время. Это в сочетании со сценарием перезагрузки резервной копии базы данных позволяет промывать и повторять при написании функций обновления.
Надеюсь, полезно для вас. Удачи.
источник
--module=mymodule --version=7299
которая устанавливает таблицу sys на единицу раньше вашей. Таким образом, на следующем дубле ваш 7300 будет запущен. Так что, нет, не просто дайте ему последние две цифры, но и целое число,mymodule_update_
независимо от того, что это может быть 9123667 .. :) @Eelke также имеет хорошее описание в своем ответе.Чтобы ваш хук обновления снова запустился, вам нужно установить schema_version на 1 ниже порядкового номера вашего хука .
Технически, все, что ниже ловушки, которую вы хотите перезапустить, и выше ловушки обновления, которую вам не нужно / не нужно перезапускать (но по крайней мере 0; -1 означает, что модуль не установлен), в порядке; если нет других ловушек обновления, это означает, что даже 0 попадает между этими границами, но в типичном случае ловушки обновления увеличиваются на единицу, поэтому только снижение на 1 является единственным безопасным вариантом, если вы не хотите запускать больше кода чем текущий максимальный хук обновления.
Процесс обновления просто проверяет это значение и проверяет, есть ли какие-либо ловушки обновления с более высоким порядковым номером. Если это так, он будет запускать их в последовательности. (Это также означает, что в процессе установки устанавливается версия схемы, соответствующая самой высокой из доступных ловушек обновления; предполагается, что после установки ваш модуль будет иметь состояние, соответствующее этой последней ловушке обновления).
источник