resetowanie statusu hook_update_n modułu

14

Rozszerzam moduł, który wcześniej napisałem i wymaga pewnych zmian schematu, które wdrażam hook_update_N.

Mam zaktualizowaną wersję tego modułu od 7.x-1.0celu 7.x-1.1i wdrożyła foo_update_7100i działa dobrze.

Problem polega na tym, że popełniłem błąd w środku foo_update_7100i teraz, gdy go naprawiłem, nie mogę ponownie uruchomić aktualizacji 7100. Muszę utworzyć 7101, ale to nie ma sensu, ponieważ wszystkie moje zmiany nie zostały jeszcze zatwierdzone.

Próbowałem zresetować status hook_update_n poprzez:

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

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

Potem robię, drush cc allale drush updatedb -ywciąż daje mi komunikat „Nie wymaga aktualizacji bazy danych”.

Jak mogę to rozwiązać, zamiast po prostu zwiększać hook_update_Nliczbę?

Cherouvim
źródło
1
Spróbuj ustawić go na 0 zamiast -1.
Andy,
Dzięki. To się udało. Powinienem był zobaczyć opis kolumny, który wyraźnie wspomina, że -1oznacza to, że moduł nie jest zainstalowany. Możesz to opublikować jako odpowiedź, aby zaakceptować.
cherouvim

Odpowiedzi:

14

Ustawienie na 0 powinno działać. system_schema()mówi, że wartość powinna wynosić:

-1 jeśli moduł nie jest zainstalowany (jego tabele nie istnieją); 0 lub największa N funkcji hook_update_N () modułu, która została uruchomiona lub istniała podczas pierwszej instalacji modułu.

Andy
źródło
1
W rzeczywistości działałoby to tylko wtedy, gdy jest to jedyny hak aktualizacji; zazwyczaj spowoduje to ponowne uruchomienie wszystkich haków aktualizacji. Bezpieczniej jest ustawić wartość na 1 poniżej liczby haka aktualizacji, który należy ponownie uruchomić (i będą również działać haki z kolejnymi numerami).
Eelke Blok
Czy istnieje powód, dla którego -1pojawiłby się moduł, który według Drupala jest włączony?
cdmo
6

Do Twojej wiadomości, w Drupal 8, tabela systemowa została usunięta, a te informacje są teraz przechowywane w tabeli wartość_klucza .

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

(Jak wspomniano powyżej, rzeczywista wartość powinna być mniejsza niż hook_update_N (), którą chcesz powtórzyć, ale wyższa lub równa ostatniej aktualizacji, która nie musi być powtarzana).

micahw156
źródło
3

Zrobiłem to tak bardzo, że ostatecznie napisałem moduł drush, aby wycofać wersję aktualizacji w tabeli systemowej. Nazywany „uroll” w celu wycofania aktualizacji.

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

Zastosowanie: drush uroll --module = mycustommodule --version = 5

To bardzo proste, ale używam go cały czas. To w połączeniu ze skryptem ponownego ładowania kopii zapasowej bazy danych umożliwia płukanie i powtarzanie podczas pisania funkcji aktualizacji.

Mam nadzieję, że ci pomogę. Powodzenia.

Dan Shumaker
źródło
Niesamowite! Drupal 7 czy Drupal 8?
Ignacio Segura Postigo
1
D7 tylko na razie.
Dan Shumaker
Ten jest dobry. Pomogło mi. Dla wyjaśnienia, jeśli moja hook_update_N jest jak mymodule_update_7000, to w komendzie drush uroll dla wersji mogę ustawić 0. Czy mam rację?
Austin
1
@Kamal Przepraszam, że powinienem to lepiej udokumentować. Jeśli bieżący haczyk, który piszesz hook_update_N jest na 7300, dałbyś uroll, --module=mymodule --version=7299 który ustawia tabelę sys na jeden przed twoim. Zatem przy następnym dbupie twoja 7300 zostanie uruchomiona. Więc nie, podaj nie tylko dwie ostatnie cyfry, ale cały numer poza mymodule_update_tym, co może być 9123667 .. :) @Eelke ma również dobry opis w swojej odpowiedzi.
Dan Shumaker,
0

Aby ponownie uruchomić haka aktualizacji, powinieneś ustawić wartość schema_version na 1 poniżej numeru sekwencji twojego haka .

Technicznie rzecz biorąc, wszystko poniżej zaczepu, który chcesz uruchomić ponownie i powyżej zaczepu aktualizacji, którego nie potrzebujesz / chcesz uruchomić ponownie (ale co najmniej 0; -1 oznacza, że ​​moduł nie jest zainstalowany) jest OK; jeśli nie ma innych haków aktualizacji, oznacza to, że nawet 0 mieści się między tymi granicami, ale w typowym przypadku haki aktualizacji są zwiększone o jeden, więc tylko 1 niższy poziom jest jedyną bezpieczną opcją, jeśli nie chcesz uruchamiać więcej kodu niż obecny najwyższy hak aktualizacji.

Proces aktualizacji po prostu sprawdza tę wartość i sprawdza, czy istnieją jakieś punkty zaczepienia aktualizacji o wyższym numerze sekwencyjnym. Jeśli tak, uruchomi je kolejno. (Oznacza to również, że proces instalacji ustawia wersję schematu na odpowiadającą najwyższemu dostępnemu hookowi aktualizacji; zakłada, że ​​podczas instalacji moduł będzie miał stan odpowiadający temu ostatniemu hookowi aktualizacji).

Eelke Blok
źródło
0

Dla każdego, kto wciąż szuka odpowiedzi, możesz to zrobić na 3 sposoby:

  • SQL: UPDATE system SET schema_version = [N *] WHERE name = '[Name of module]';

  • Drush: drush ev "drupal_set_installed_schema_version ('[Nazwa modułu]', [N *])”

  • Drush uroll drush uroll --module = [Nazwa modułu] --version = N *

* N oznacza funkcję aktualizacji, do której chcesz przywrócić (tj. Ostatnią udaną funkcję aktualizacji)

Anwar-Artin Khoury
źródło