Zurücksetzen des hook_update_n-Status eines Moduls

14

Ich erweitere ein Modul, das ich zuvor geschrieben habe, und es benötigt einige Schemaänderungen, die ich implementiere hook_update_N.

Ich habe die Version des Moduls von 7.x-1.0auf aktualisiert 7.x-1.1und implementiert foo_update_7100und es funktioniert einwandfrei.

Das Problem ist, dass ich im Inneren einen Fehler gemacht habe foo_update_7100und jetzt, da ich ihn behoben habe, das 7100-Update nicht erneut ausführen kann. Ich muss eine 7101 erstellen, aber das macht keinen Sinn, da alle meine Änderungen noch nicht festgeschrieben sind.

Ich habe versucht, den Status von hook_update_n zurückzusetzen über:

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

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

Dann gebe ich mir drush cc alldoch drush updatedb -ynoch "Keine Datenbankupdates erforderlich".

Wie kann ich das lösen, anstatt einfach die hook_update_NZahl zu erhöhen ?

Cherouvim
quelle
1
Versuchen Sie es auf 0 anstatt -1.
Andy
Vielen Dank. Das hat funktioniert. Ich hätte die Spaltenbeschreibung sehen sollen, in der deutlich erwähnt wird, -1dass das Modul nicht installiert ist. Fühlen Sie sich frei, dies als Antwort zu posten, damit ich akzeptieren kann.
Cherouvim

Antworten:

14

Das Setzen auf 0 sollte funktionieren. system_schema()sagt der Wert sollte sein:

-1 wenn das Modul nicht installiert ist (seine Tabellen existieren nicht); 0 oder das größte N der Funktion hook_update_N () des Moduls, die bei der Erstinstallation des Moduls ausgeführt wurde oder vorhanden war.

Andy
quelle
1
Tatsächlich würde dies nur funktionieren, wenn dies der einzige Update-Hook ist. In der Regel werden dadurch alle Update-Hooks erneut ausgeführt. Es ist sicherer, den Wert 1 unter der Nummer des Aktualisierungs-Hooks festzulegen, den Sie erneut ausführen müssen (und alle Hooks mit nachfolgenden Nummern werden ebenfalls ausgeführt).
Eelke Blok
Gibt es einen Grund, der -1für ein Modul zeigen würde , dass Drupal sagt ist aktiviert?
CDMO
6

Zu Ihrer Information, in Drupal 8 wurde die Systemtabelle entfernt und diese Informationen werden nun in der key_value- Tabelle gespeichert .

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

(Wie oben erwähnt, sollte der tatsächliche Wert kleiner sein als der Wert von hook_update_N (), den Sie wiederholen möchten, aber höher als das letzte Update, das nicht wiederholt werden muss, oder mit diesem übereinstimmen.)

micahw156
quelle
3

Ich habe dies so oft getan, dass ich ein Drush-Modul geschrieben habe, um die Update-Version in der Systemtabelle zurückzusetzen. Wird "uroll" für Update-Rollback genannt.

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

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

Es ist super einfach, aber ich benutze es die ganze Zeit. In Kombination mit einem Skript zum erneuten Laden der Datenbanksicherung können Sie diese beim Schreiben von Aktualisierungsfunktionen spülen und wiederholen.

Hoffentlich hilfreich für Sie. Viel Glück.

Dan Shumaker
quelle
Genial! Drupal 7 oder Drupal 8?
Ignacio Segura Postigo
1
D7 erstmal.
Dan Shumaker
Das ist ein guter. Half mir. Nur zur Verdeutlichung, wenn mein hook_update_N wie mymodule_update_7000 ist, kann ich in Ihrem drush uroll-Befehl für die Version 0 eingeben. Stimmt das?
Austin
1
@ Kamal Sorry, ich sollte es besser dokumentieren. Wenn der aktuelle Hook, den du schreibst, hook_update_N bei 7300 liegt, gibst du uroll ein, --module=mymodule --version=7299 wodurch die sys-Tabelle auf eins vor deiner gesetzt wird. Somit wird beim nächsten dbup deine 7300 gestartet. Also, nein, gib nicht nur die letzten beiden Ziffern ein, sondern die ganze Zahl nach mymodule_update_9123667. :) @Eelke hat auch eine gute Beschreibung in seiner Antwort.
Dan Shumaker,
0

Damit Ihr Update-Hook erneut ausgeführt wird, sollten Sie die schema_version unter der Folgenummer Ihres Hooks auf 1 setzen .

Technisch gesehen ist alles unter dem Hook, den Sie erneut ausführen möchten, und über dem Update-Hook, den Sie nicht erneut ausführen möchten / müssen (aber mindestens 0; -1 bedeutet, dass das Modul nicht installiert ist), in Ordnung. Wenn es keine anderen Update-Hooks gibt, bedeutet dies, dass sogar 0 zwischen diesen Grenzen liegt. Im Normalfall werden Update-Hooks jedoch um eins erhöht. Wenn Sie also keinen weiteren Code ausführen möchten, ist es die einzig sichere Option, nur 1 zu senken als der aktuell höchste Update-Hook.

Der Aktualisierungsprozess überprüft einfach diesen Wert und stellt fest, ob Aktualisierungs-Hooks mit einer höheren Sequenznummer vorhanden sind. In diesem Fall werden sie nacheinander ausgeführt. (Dies bedeutet auch, dass der Installationsprozess die Schemaversion auf die Version setzt, die dem höchsten verfügbaren Update-Hook entspricht. Es wird davon ausgegangen, dass Ihr Modul bei der Installation einen Status hat, der dem letzten Update-Hook entspricht.)

Eelke Blok
quelle