Drupal 8 & 9 - Hook Update - Tester si une table existe, la supprimer et la recréer

Posté le Vendredi 5 juin 2020 - 09:25

Pour un projet drupal, j'avais besoin de créer deux tables identiques dans une base de données séparée sur un serveur différent, afin de servir de cache pour un webservice.

Voici le code que j'ai utilisé pour créer ces tables avec un test si les tables existe avant de les récréer (si j'ai besoin de mettre à jour le modèle par exemple).

Définition du schéma de ma table dans le fichier MODULE.install :

  1. # Le nom de cette fonction est personnel, je n'utilise pas le HOOK_schema() ici
  2. function MODULE_schema_db_cache() {
  3. $schema['proposals'] = [
  4. 'description' => 'distribProposal',
  5. 'fields' => [],
  6. 'primary key' => ['id'],
  7. 'indexes' => [
  8. 'id' => ['id'],
  9. 'room_type_code' => ['room_type_code'],
  10. ],
  11. ];
  12.  
  13. $schema['proposals']['fields']['id'] = [
  14. 'description' => 'id',
  15. 'type' => 'serial',
  16. 'not null' => TRUE,
  17. 'unsigned' => TRUE,
  18. ];
  19.  
  20. $schema['proposals']['fields']['name'] = [
  21. 'type' => 'varchar',
  22. 'length' => 255,
  23. ];
  24. //Ajout des champs supplémentaires ici
  25. }

Création des tables via un hook_update() :

  1. /**
  2.  * DB cache ws - Creation tables
  3.  */
  4. function MODULE_core_update_8005() {
  5. try {
  6. // Je passe sur une autre base de données définis dans mes settings
  7. // ici : $databases['cache_ws']['default']
  8. Database::setActiveConnection('cache_ws');
  9. // Je récupère le schéma
  10. $db = MODULE_schema_db_cache();
  11. if($schema = Database::getConnection()->schema()) {
  12. // Je veux avoir deux fois la même table afin de passer sur la seconde quand je met à jour la première
  13. $tables = ['proposals_a', 'proposals_b'];
  14. foreach ($tables as $table) {
  15. // Si la table existe déjà je la supprime
  16. if ($schema->tableExists($table)) {
  17. $schema->dropTable($table);
  18. }
  19. // Puis je la recrée
  20. $schema->createTable($table, $db['proposals']);
  21. }
  22. }
  23. }
  24. catch (Exception $e) {
  25. // En cas de soucis je commence par basculer sur la base de donnée par défaut
  26. Database::setActiveConnection();
  27.  
  28. // Puis je lance une erreur
  29. throw new \Drupal\Core\Utility\UpdateException(t('vacanceole_core_update_8005 error : @message', ['@message' => $e->getMessage()]));
  30. }
  31. // Si tout s'est bien passé je repasse sur la base de données par défaut.
  32. Database::setActiveConnection();
  33. return t('Tables proposals_a and proposals_b successfully created');
  34. }

Pour bien faire je devrais ajouter l'installation de mes tables dans un hook install, en faisant appel à la fonction que je viens de définir :

  1. function MODULE_install() {
  2. MODULE_update_8005();
  3. }

 

Aller plus loin ?

 

Ajouter un commentaire

Ne sera pas publié

HTML restreint

  • Balises HTML autorisées : <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • Les adresses de pages web et les adresses courriel se transforment en liens automatiquement.
CAPTCHA Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...