перезавантаження статусу модуля_підключення_наконтаження_n


14

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

Я оновив версію модуля 7.x-1.0до 7.x-1.1і реалізував, foo_update_7100і він працює чудово.

Проблема в тому, що я помилився всередині, foo_update_7100і тепер, коли я це виправив, я не можу повторити оновлення 7100. Мені потрібно створити 7101, але це не має сенсу, оскільки всі мої зміни ще не здійснені.

Я спробував скинути статус прив’язки_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, а не на -1.
Енді

Спасибі. Це спрацювало. Я повинен був бачити опис стовпця, який чітко згадує про те, -1що модуль не встановлений. Не соромтеся розмістити це як відповідь, щоб я міг прийняти.
cherouvim

Відповіді:


14

Встановлення його на 0 повинно працювати. system_schema()говорить, що значення повинно бути:

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


1
Власне, це спрацює лише в тому випадку, якщо це єдиний гачок оновлення; як правило, це призведе до запуску всіх гаків оновлення. Безпечніше встановити значення на 1 нижче, ніж номер гачка оновлення, який потрібно повторно запустити (і будь-які гачки з наступними номерами також будуть працювати).
Eelke Blok

Чи є причина , по якій -1буде відображатися для модуля , який Drupal каже буде включений?
cdmo

6

FYI, в Drupal 8 системну таблицю було видалено, і ця інформація тепер зберігається в таблиці значень key_value .

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

(Як зазначалося вище, фактичне значення має бути меншим, ніж прив'язка_update_N (), яку ви хочете повторити, але вище або відповідати останньому оновленню, яке не потрібно повторювати.)


3

Я зробив це настільки сильно, що закінчив писати модуль барабану, щоб повернути оновлену версію в системну таблицю. Викликається "uroll" для відкату оновлення.

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

Використання: ударний uroll --module = mycustommodule --version = 5

Це дуже просто, але я використовую його постійно. Цей у поєднанні зі скриптом для перезавантаження резервної копії бази даних дозволяє промивати та повторювати при написанні функцій оновлення.

Сподіваємось, допоможе вам. Удачі.


Дивовижно! Drupal 7 або Drupal 8?
Ігнасіо Сегура Постіго

1
D7 лише зараз.
Dan Shumaker

Це добре. Допомогли мені. Просто для уточнення, якщо мій_up_update_N схожий на mymodule_update_7000, то у вашій команді drroll uroll для версії я можу поставити 0. Я прав?
Остін

1
@Kamal Вибачте, я повинен це краще документувати. Якщо поточний гак, на який ви пишете moka_update_N, становить 7300, тоді ви дасте uroll --module=mymodule --version=7299 Який встановлює таблицю sys на одну перед вашою. Таким чином, у наступному dbup ваш 7300 запускається. Отже, ні, не просто дайте йому останні дві цифри, але ціле число минуле, як mymodule_update_би це не було 9123667 .. :) @ @Eelke має хороший опис і у своїй відповіді.
Ден Шумкер

0

Щоб знов запустити гачок оновлення, слід встановити схему_версії на 1 нижче послідовного номера вашого гака .

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

Процес оновлення просто перевіряє це значення і бачить, чи є гачки оновлення з більшим порядковим номером. Якщо це так, вони запускатимуть їх послідовно. (Це також означає, що процес встановлення встановлює версію схеми такою, що відповідає найвищому доступному гачку оновлення; він передбачає, що після встановлення ваш модуль матиме стан, відповідний цьому останньому гачку оновлення).


0

Для тих, хто все ще шукає відповідь, ви можете досягти цього трьома способами:

  • SQL: UPDATE система SET schema_version = [N *] WHERE name = '[Назва модуля]';

  • Друш: drush ev "drupal_set_installed_schema_version ('[Назва модуля]', [N *])"

  • Drush uroll drroll uroll --module = [Назва модуля] --version = N *

* N не є функцією оновлення, до якої потрібно повернути (тобто остання успішна функція оновлення)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.