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.1
et mis à exécution les foo_update_7100
et il fonctionne très bien.
Le problème est que j'ai fait une erreur à l'intérieur foo_update_7100
et 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 all
mais drush updatedb -y
me 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_N
nombre?
-1
signifie que le module n'est pas installé. N'hésitez pas à poster cela comme réponse pour que je puisse accepter.Réponses:
Le mettre à 0 devrait fonctionner.
system_schema()
dit que la valeur devrait être:la source
-1
apparaîtrait pour un module qui, selon Drupal, est activé?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 .
(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.)
la source
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.
la source
--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.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).
la source