Yii - Migration de base de données

Lors du développement d'une application basée sur une base de données, la structure de la base de données évolue avec le code source. Yii fournit ledatabase migration fonctionnalité qui vous permet de suivre les modifications de la base de données.

Yii fournit les outils de ligne de commande de migration suivants -

  • Créer de nouvelles migrations
  • Annuler les migrations
  • Appliquer les migrations
  • Réappliquer les migrations
  • Afficher l'état et l'historique de la migration

Créer une migration

Créons une nouvelle migration de base de données.

Step 1 - À l'intérieur de la racine du projet du modèle d'application de base, ouvrez la fenêtre de la console et exécutez.

./yii migrate/create add_news_table

La commande ci-dessus créera un nouveau fichier de migration (m160113_102634_add_news_table.php dans ce cas) dans le migrations dossier.

Le fichier contient le code suivant -

<?php
   use yii\db\Schema;
   use yii\db\Migration;
   class m160113_102634_add_news_table extends Migration {
      public function up() {
   
      }
      public function down() {
         echo "m160113_102634_add_news_table cannot be reverted.\n";
         return false;
      }
      /*
      // Use safeUp/safeDown to run migration code within a transaction
      public function safeUp() {
 
      }
      public function safeDown() {
   
      }
      */
   }
?>

Chaque migration de base de données est une classe PHP étendant le yii\db\Migrationclasse. Le nom de la classe est généré au format suivant -

m<YYMMDD_HHMMSS>_<Name>

<YYMMDD_HMMSS> est la date UTC à laquelle la commande de migration a été exécutée et <Name> est l'argument que vous avez fourni dans la commande de console.

La méthode up () est appelée lorsque vous mettez à niveau votre base de données, tandis que la méthode down () est appelée lorsque vous la rétrogradez.

Step 2 - Pour ajouter une nouvelle table à la base de données, modifiez le fichier de migration de cette manière.

<?php
   use yii\db\Schema;
   use yii\db\Migration;
   class m160113_102634_add_news_table extends Migration {
      public function up() {
         $this->createTable("news", [ "id" => Schema::TYPE_PK, "title" => Schema::TYPE_STRING, "content" => Schema::TYPE_TEXT, ]); } public function down() { $this->dropTable('news');
      }
      /*
      // Use safeUp/safeDown to run migration code within a transaction
      public function safeUp() {
	
      }
      public function safeDown() {

      }
      */
   }
?>

Dans le code ci-dessus, nous avons créé une nouvelle table appelée news dans le up() et a supprimé cette table dans le down() méthode.

le newstable se compose de trois champs: id, titre et contenu. Lors de la création d'une table ou d'une colonne, nous devons utiliser des types abstraits afin que les migrations soient indépendantes d'un type de base de données. Par exemple, dans le cas de MySQL, TYPE_PK sera converti en int (11) NOT NUL AUTO_INCREMETN PRIMARY KEY.

Step 3 - Pour mettre à niveau une base de données, exécutez cette commande.

./yii migrate

La commande ci-dessus répertorie toutes les migrations disponibles qui n'ont pas encore été appliquées. Ensuite, si vous confirmez d'appliquer les migrations, il exécutera safeUp () ou up () dans toutes les nouvelles classes de migration.

Step 4 - Pour appliquer uniquement trois migrations disponibles, vous pouvez exécuter.

./yii migrate 3

Step 5 - Vous pouvez également définir une migration particulière vers laquelle la base de données doit être migrée.

# utilisation de l'horodatage pour spécifier la migration

yii migrate/to 160202_195501

# en utilisant une chaîne qui peut être analysée par strtotime ()

yii migrate/to "2016-01-01 19:55:01"

# en utilisant le nom complet

yii migrate/to m160202_195501_create_news_table

# utilisation de l'horodatage UNIX

yii migrate/to 1393964718

Step 6 - Pour annuler une migration (exécutez les méthodes down () ou safeDown ()), exécutez.

./yii migrate/down

Step 7 - Pour annuler les cinq dernières migrations appliquées, vous pouvez exécuter.

./yii migrate/down 5

Step 8 - Pour refaire (revenir et appliquer à nouveau) les migrations, exécutez.

./yii migrate/redo

Pour lister les migrations déjà appliquées, utilisez ces commandes -

  • yii migrate/new # affiche les 10 premières nouvelles migrations

  • yii migrate/new 3 # affiche les 3 premières nouvelles migrations

  • yii migrate/new all # affiche toutes les nouvelles migrations

  • yii migrate/history # affiche les 10 dernières migrations appliquées

  • yii migrate/history 20 # affiche les 20 dernières migrations appliquées

  • yii migrate/history all # affiche toutes les migrations appliquées

Parfois, vous devez ajouter ou supprimer une colonne d'une table spécifique. Vous pouvez utiliseraddColumn() et dropColumn() méthodes.

Step 1 - Créez une nouvelle migration.

./yii migrate/create add_category_to_news

Step 2 - Modifiez le fichier de migration nouvellement créé de cette manière.

<?php
   use yii\db\Schema;
   use yii\db\Migration;
   class m160113_110909_add_category_to_news extends Migration {
      public function up() {
         $this->addColumn('news', 'category', $this->integer());
      }
      public function down() {
         $this->dropColumn('news', 'category');
      }
   }
?>

Maintenant, si tu cours ./yii migrate, la colonne de catégorie doit être ajoutée au tableau des actualités. Au contraire, si vous courez./yii migrate/down 1, la colonne de catégorie doit être supprimée.

Lors de l'exécution de migrations de bases de données, il est important de s'assurer que chaque migration a réussi ou échoué. Il est recommandé d'inclure les opérations DB dans une transaction. Pour implémenter des migrations transactionnelles, vous devez simplement mettre le code de migration dans lesafeUp() et safeDown()méthodes. Si une opération de ces méthodes échoue, toutes les opérations précédentes seront annulées.

L'exemple précédent de la «manière transactionnelle» sera -

<?php
   use yii\db\Schema;
   use yii\db\Migration;
   class m160113_110909_add_category_to_news extends Migration {
      public function safeUp() {
         $this->addColumn('news', 'category', $this->integer()); } public function safeDown() { $this->dropColumn('news', 'category');
      }
   }
?>

le yii\db\Migration class fournit les méthodes suivantes pour manipuler les bases de données -

  • execute() - Exécute une instruction SQL brute

  • createTable() - Crée une table

  • renameTable() - Renomme une table

  • insert() - Insère une seule ligne

  • batchInsert() - Insère plusieurs lignes

  • update() - Met à jour les lignes

  • delete() - Supprime les lignes

  • addColumn() - Ajoute une colonne

  • renameColumn() - Renomme une colonne

  • dropColumn() - Supprime une colonne

  • alterColumn() - Modifie une colonne

  • dropTable() - Supprime une table

  • truncateTable() - Supprime toutes les lignes d'un tableau

  • createIndex() - Crée un index

  • dropIndex() - Supprime un index

  • addPrimaryKey() - Ajoute une clé primaire

  • dropPrimaryKey() - Supprime une clé primaire

  • addForeignKey() - Ajoute une clé étrangère

  • dropForeignKey() - Supprime une clé étrangère