reimpostare lo stato hook_update_n di un modulo


14

Sto estendendo un modulo che ho scritto in precedenza e ha bisogno di alcune modifiche allo schema in cui implemento hook_update_N.

Ho aggiornato la versione del modulo da 7.x-1.0al 7.x-1.1e implementato l' foo_update_7100e funziona benissimo.

Il problema è che ho fatto un errore all'interno foo_update_7100e ora che l'ho risolto non posso rieseguire l'aggiornamento 7100. Devo crearne uno 7101, ma non ha senso perché non sono ancora stati eseguiti tutti i miei cambiamenti.

Ho provato a ripristinare lo stato di hook_update_n tramite:

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

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

Poi lo faccio drush cc allma drush updatedb -ymi dà ancora "Nessun aggiornamento del database richiesto".

Come posso risolvere questo problema invece di incrementare semplicemente il hook_update_Nnumero?


1
Prova a impostarlo su 0 anziché su -1.
Andy,

Grazie. Ha funzionato Avrei dovuto vedere la descrizione della colonna che menziona chiaramente che -1significa che il modulo non è installato. Sentiti libero di postarlo come risposta in modo che io possa accettare.
Cherouvim,

Risposte:


14

Impostandolo su 0 dovrebbe funzionare. system_schema()dice che il valore dovrebbe essere:

-1 se il modulo non è installato (le sue tabelle non esistono); 0 o la N più grande della funzione hook_update_N () del modulo che è stata eseguita o esisteva al momento della prima installazione del modulo.


1
In realtà, questo funzionerebbe solo se questo è l'unico hook di aggiornamento; in genere, ciò causa nuovamente l'esecuzione di tutti gli hook di aggiornamento. È più sicuro impostare il valore su 1 al di sotto del numero dell'hook di aggiornamento che è necessario rieseguire (e verranno eseguiti anche tutti gli hook con numeri successivi).
Eelke Blok,

C'è un motivo che -1si presenterebbe per un modulo che Drupal dice che è abilitato?
cdmo,

6

Cordiali saluti, in Drupal 8, la tabella di sistema è stata rimossa e queste informazioni sono ora memorizzate nella tabella key_value .

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

(Come notato sopra, il valore effettivo dovrebbe essere inferiore a hook_update_N () che si desidera ripetere, ma superiore o corrispondente all'ultimo aggiornamento che non deve essere ripetuto.)


3

Ho fatto così tanto che ho finito per scrivere un modulo drush per ripristinare la versione di aggiornamento nella tabella di sistema. Chiamato "uroll" per il rollback dell'aggiornamento.

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

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

È semplicissimo ma lo uso sempre. Questo combinato con uno script di ricarica del backup del database consente di risciacquare e ripetere quando si scrivono le funzioni di aggiornamento.

Spero utile per te. In bocca al lupo.


Eccezionale! Drupal 7 o Drupal 8?
Ignacio Segura Postigo,

1
D7 solo per ora.
Dan Shumaker,

È buono. Mi ha aiutato. Solo per chiarire se il mio hook_update_N è come mymodule_update_7000, allora nel tuo comando drush uroll per la versione posso mettere 0. Ho ragione?
Austin,

1
@Kamal Mi spiace dovrei documentarlo meglio. Se l'attuale hook che stai scrivendo hook_update_N è a 7300, allora daresti uroll --module=mymodule --version=7299 che imposta la tabella sys su una prima della tua. Quindi al prossimo dbup il tuo 7300 viene eseguito. Quindi, no, non mymodule_update_limitarti a dare le ultime due cifre, ma l'intero numero oltre quello che può essere 9123667 .. :) @Eelke ha anche una buona descrizione nella sua risposta.
Dan Shumaker,

0

Per riavviare il hook di aggiornamento, è necessario impostare schema_version su 1 sotto il numero di sequenza del hook .

Tecnicamente, tutto sotto il gancio che si desidera rieseguire e sopra il gancio di aggiornamento non è necessario / si desidera rieseguire (ma almeno 0; -1 indica che il modulo non è installato) è OK; se non ci sono altri hook di aggiornamento, ciò significa che anche 0 rientra tra questi limiti, ma nel caso tipico, gli hook di aggiornamento vengono aumentati di uno, quindi solo 1 in meno è l'unica opzione sicura se non si desidera eseguire più codice rispetto all'attuale hook di aggiornamento più alto.

Il processo di aggiornamento controlla semplicemente quel valore e vede se ci sono hook di aggiornamento con un numero di sequenza più alto. In tal caso, li eseguirà in sequenza. (Ciò significa anche che il processo di installazione imposta la versione dello schema su quella corrispondente all'hook di aggiornamento più alto disponibile; presuppone che al momento dell'installazione, il modulo avrà uno stato corrispondente all'ultimo hook di aggiornamento).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.