it-swarm.com.de

Zurücksetzen des Hook_update_n-Status eines Moduls

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

Ich habe die Version des Moduls von 7.x-1.0 Auf 7.x-1.1 Aktualisiert und foo_update_7100 Implementiert und es funktioniert einwandfrei.

Das Problem ist, dass ich in foo_update_7100 Einen Fehler gemacht habe und 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 über Folgendes zurückzusetzen:

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 mache ich drush cc all, Aber drush updatedb -y Gibt mir immer noch "Keine Datenbankaktualisierungen erforderlich".

Wie kann ich das lösen, anstatt einfach die hook_update_N - Nummer zu erhöhen?

15
cherouvim

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 entweder ausgeführt wurde oder bei der Erstinstallation des Moduls vorhanden war.

14
Andy

Zu Ihrer Information, in Drupal 8) wurde die Systemtabelle entfernt, und diese Informationen werden jetzt in der Tabelle key_value 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 hook_update_N (), den Sie wiederholen möchten, aber höher als oder übereinstimmend mit dem letzten Update, das nicht benötigt wird wiederholt werden.)

8
micahw156

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

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

Verwendung: 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 beim Schreiben von Aktualisierungsfunktionen spülen und wiederholen.

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

3
Dan Shumaker

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

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

Der Aktualisierungsprozess überprüft einfach diesen Wert und prüft, 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 diejenige 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.).

0
Eelke Blok

Für alle, die noch nach einer Antwort suchen, können Sie dies auf drei Arten erreichen:

  • SQL: UPDATE-System SET schema_version = [N *] WHERE name = '[Name des Moduls]';

  • Drush: drush ev "drupal_set_installed_schema_version ('[Name des Moduls]', [N *])"

  • Drush uroll drush uroll --module = [Name des Moduls] --version = N *

* N ist die Aktualisierungsfunktion, zu der Sie zurückkehren möchten (d. H. Die letzte erfolgreiche Aktualisierungsfunktion).

0