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.0
celu 7.x-1.1
i wdrożyła foo_update_7100
i działa dobrze.
Problem polega na tym, że popełniłem błąd w środku foo_update_7100
i 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 all
ale drush updatedb -y
wciąż daje mi komunikat „Nie wymaga aktualizacji bazy danych”.
Jak mogę to rozwiązać, zamiast po prostu zwiększać hook_update_N
liczbę?
-1
oznacza to, że moduł nie jest zainstalowany. Możesz to opublikować jako odpowiedź, aby zaakceptować.Odpowiedzi:
Ustawienie na 0 powinno działać.
system_schema()
mówi, że wartość powinna wynosić:źródło
-1
pojawiłby się moduł, który według Drupala jest włączony?Do Twojej wiadomości, w Drupal 8, tabela systemowa została usunięta, a te informacje są teraz przechowywane w tabeli wartość_klucza .
(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).
źródło
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.
źródło
--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 pozamymodule_update_
tym, co może być 9123667 .. :) @Eelke ma również dobry opis w swojej odpowiedzi.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).
źródło
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)
źródło