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.0
auf aktualisiert 7.x-1.1
und implementiert foo_update_7100
und es funktioniert einwandfrei.
Das Problem ist, dass ich im Inneren einen Fehler gemacht habe foo_update_7100
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 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 all
doch drush updatedb -y
noch "Keine Datenbankupdates erforderlich".
Wie kann ich das lösen, anstatt einfach die hook_update_N
Zahl zu erhöhen ?
-1
dass das Modul nicht installiert ist. Fühlen Sie sich frei, dies als Antwort zu posten, damit ich akzeptieren kann.Antworten:
Das Setzen auf 0 sollte funktionieren.
system_schema()
sagt der Wert sollte sein:quelle
-1
für ein Modul zeigen würde , dass Drupal sagt ist aktiviert?Zu Ihrer Information, in Drupal 8 wurde die Systemtabelle entfernt und diese Informationen werden nun in der key_value- Tabelle gespeichert .
(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.)
quelle
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.
quelle
--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 nachmymodule_update_
9123667. :) @Eelke hat auch eine gute Beschreibung in seiner Antwort.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.)
quelle