web-dev-qa-db-fra.com

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

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 dans hook_update_N.

J'ai mis à jour la version du module à partir de 7.x-1.0 à 7.x-1.1 et implémenté le foo_update_7100 et ça marche bien.

Le problème est que j'ai fait une erreur dans 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

Alors je 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 de simplement incrémenter le hook_update_N nombre?

15
cherouvim

Le mettre à 0 devrait fonctionner. system_schema() indique que la valeur doit ê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.

14
Andy

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 de être répété.)

8
micahw156

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.

3
Dan Shumaker

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 se trouve 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 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).

0
Eelke Blok

Pour toute personne qui cherche toujours une réponse, vous pouvez y parvenir de 3 manières:

  • SQL: UPDATE system SET schema_version = [N *] WHERE name = '[Nom du module]';

  • Drush: drush ev "drupal_set_installed_schema_version ('[Nom du module]', [N *])"

  • Drush uroll drush uroll --module = [Nom du module] --version = N *

* N étant la fonction de mise à jour à laquelle vous souhaitez revenir (c'est-à-dire la dernière fonction de mise à jour réussie)

0
Anwar-Artin Khoury