J'ai eu une situation dans laquelle une table créée par une fonction de mise à jour ( MYMODULE_update_7101
), mais cette table était consultée dans le code quelque part dans chaque cache clair et presque chaque appel drush (il obtenait essentiellement les noms des types d'entité pour tous les menus et autres) autre). Courir drush updatedb
courait MYMODULE_update_7101
troisième au lieu de premier.
J'ai essayé la solution suggérée par @macaleaa et @moshe weitzman de courir:
drush php-eval 'module_load_install('MYMODULE');MYMODULE_update_7101();'
avant de courir drush updatedb
, mais cela n'a pas aidé - le run de drush a échoué car a updatedb
essayé à nouveau de s'exécuter MYMODULE_update_7101()
et s'est trompé, disant que la table existait déjà. Fondamentalement, le code ci-dessus avait exécuté la mise à jour, mais n'avait pas laissé sa marque sur le système que la mise à jour avait été exécutée. Vraisemblablement, il y a tout un tas d'autres choses update.php
à faire après avoir exécuté chaque mise à jour pour stocker le dernier numéro de version du module dans la base de données, etc.
Je suis allé update.php
voir comment il exécute réellement chaque fonction de mise à jour et ce qu'il fait après, en recherchant une fonction à appeler qui appellerait la fonction de mise à jour et ferait toutes les autres choses. J'ai fini par y arriver:
include_once DRUPAL_ROOT . "/includes/update.inc";
$c["results"]["#abort"] = array();
update_do_one("MYMODULE", 7101, array(), $c);
Ce que j'ai couru avec drush:
drush eval 'include_once DRUPAL_ROOT . "/includes/update.inc"; $c["results"]["#abort"] = array(); update_do_one("MYMODULE", 7101, array(), $c);'
Il a exécuté la mise à jour, pas de problème, mais la version 7101 de MYMODULE est toujours apparue dans la liste des mises à jour lorsque j'ai exécuté updatedb
, bien que cela se soit déroulé sans erreur et tout semblait bien lors de l'inspection du site.
Un peu hacky et 6 ans de retard, mais tout va bien qui se termine bien?