réinitialisation de l'état hook_update_n d'un module

14

J'étends un module que j'ai écrit précédemment et il a besoin de quelques modifications de schéma que j'implémente hook_update_N.

J'ai mis à jour la version du module de 7.x-1.0à 7.x-1.1et mis à exécution les foo_update_7100et il fonctionne très bien.

Le problème est que j'ai fait une erreur à l'intérieur foo_update_7100et maintenant que je l'ai corrigé, je ne peux pas relancer la mise à jour 7100. J'ai besoin d'en créer un 7101 mais cela n'a pas de sens car toutes mes modifications ne sont pas encore validées.

J'ai essayé de réinitialiser l'état du hook_update_n via:

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

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

Ensuite, je le fais drush cc allmais drush updatedb -yme donne toujours "Aucune mise à jour de base de données requise".

Comment puis-je résoudre ce problème au lieu d'augmenter simplement le hook_update_Nnombre?

cherouvim
la source
1
Essayez de le mettre à 0 plutôt qu'à -1.
Andy
Merci. Ça a marché. J'aurais dû voir la description de la colonne qui mentionne clairement que cela -1signifie que le module n'est pas installé. N'hésitez pas à poster cela comme réponse pour que je puisse accepter.
cherouvim

Réponses:

14

Le mettre à 0 devrait fonctionner. system_schema()dit que la valeur devrait être:

-1 si le module n'est pas installé (ses tables n'existent pas); 0 ou le plus grand N de la fonction hook_update_N () du module qui a été exécuté ou existait lors de la première installation du module.

Andy
la source
1
En fait, cela ne fonctionnerait que s'il s'agit du seul crochet de mise à jour; En règle générale, cela entraînera la réexécution de tous les hooks de mise à jour. Il est plus sûr de définir la valeur à 1 en dessous du numéro du hook de mise à jour que vous devez réexécuter (et tous les hooks avec des numéros suivants s'exécuteront également).
Eelke Blok
Y a-t-il une raison qui -1apparaîtrait pour un module qui, selon Drupal, est activé?
cdmo
6

Pour info, dans Drupal 8, la table système a été supprimée, et ces informations sont désormais stockées dans la table key_value .

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

(Comme indiqué ci-dessus, la valeur réelle doit être inférieure à hook_update_N () que vous souhaitez répéter, mais supérieure ou égale à la dernière mise à jour qui n'a pas besoin d'être répétée.)

micahw156
la source
3

J'ai tellement fait cela que j'ai fini par écrire un module drush pour restaurer la version de mise à jour dans la table système. Appelé "uroll" pour l'annulation de la mise à jour.

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

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

C'est super simple mais je l'utilise tout le temps. Ceci combiné avec un script de rechargement de sauvegarde de base de données vous permet de rincer et de répéter lors de l'écriture des fonctions de mise à jour.

J'espère que cela vous sera utile. Bonne chance.

Dan Shumaker
la source
Impressionnant! Drupal 7 ou Drupal 8?
Ignacio Segura Postigo
1
D7 seulement pour l'instant.
Dan Shumaker
C'est une bonne chose. M'a aidé. Juste pour clarifier si mon hook_update_N est comme mymodule_update_7000, alors dans votre commande drush uroll pour la version, je peux mettre 0. Ai-je raison?
Austin
1
@Kamal Désolé, je devrais mieux le documenter. Si le hook actuel que vous écrivez hook_update_N est à 7300, alors vous donneriez uroll --module=mymodule --version=7299 qui définit la table sys à une avant la vôtre. Ainsi, lors du prochain dbup, votre 7300 s'exécute. Donc, non, ne lui donnez pas seulement les deux derniers chiffres, mais le nombre entier passé mymodule_update_quel qu'il soit 9123667 .. :) @Eelke a aussi une bonne description dans sa réponse.
Dan Shumaker
0

Pour que votre hook de mise à jour s'exécute à nouveau, vous devez définir la version de schéma sur 1 sous le numéro de séquence de votre hook .

Techniquement, tout ce qui est en dessous du hook que vous souhaitez réexécuter et au - dessus du hook de mise à jour dont vous n'avez pas besoin / ne souhaitez pas réexécuter (mais au moins 0; -1 signifie que le module n'est pas installé) est OK; s'il n'y a pas d'autres crochets de mise à jour, cela signifie que même 0 tombe entre ces limites, mais dans le cas typique, les crochets de mise à jour sont augmentés de un, donc seulement aller 1 plus bas est la seule option sûre si vous ne voulez pas exécuter plus de code que le crochet de mise à jour le plus élevé actuel.

Le processus de mise à jour vérifie simplement cette valeur et vérifie s'il existe des hooks de mise à jour avec un numéro de séquence supérieur. Si c'est le cas, il les exécutera en séquence. (Cela signifie également que le processus d'installation définit la version du schéma sur celle correspondant au hook de mise à jour disponible le plus élevé; cela suppose qu'à l'installation, votre module aura un état correspondant à ce dernier hook de mise à jour).

Eelke Blok
la source