TypeORM - Migrations

Les migrations sont comme le contrôle de version de votre base de données. Il est utilisé pour modifier et partager le schéma de base de données de l'application. Cette section explique le fonctionnement des migrations dans TypeORM.

Créer une nouvelle migration

Pour créer une nouvelle migration, nous devons d'abord configurer la connexion dans ormconfig.json. Il est défini ci-dessous -

ormconfig.json

"type": "mysql", 
"host": "localhost", 
"port": 8889, 
"username": "root", 
"password": "root", 
"database": "Library", 
"entities": ["entity/*.js"], "migrationsTableName": "student_migration_table", "migrations": ["migration/*.js"], "cli": { 
   "migrationsDir": "migration" 
}

Ici,

  • migrationsTableName - il fait référence au nom de la table de migration.
  • migrations - TypeORM charge les migrations à partir du répertoire donné.
  • cli - indique que la migration va créer dans le répertoire spécifique.

Créer une entité de livre

Créons une entité nommée Book entité à l'intérieur src/entity/Book.ts comme suit -

import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm'; 
@Entity() 
export class Book { 

   @PrimaryGeneratedColumn() 
   id: number; 
   
   @Column() 
   title: string;
   
   @Column() 
   text: string; 
}

Exécuter la CLI pour créer une nouvelle migration

Maintenant, nous pouvons exécuter une nouvelle migration à l'aide de la CLI comme suit -

Syntaxe

typeorm migration:create -n <migration-name>

Exemple

typeorm migration:create -n myMigration

Après avoir exécuté la commande ci-dessus, vous pouvez voir la réponse ci-dessous -

Migration /path/to/project/src/migration/1587101104904-myMigration.ts has been generated successfully.

Maintenant, déplacez-vous à l'intérieur src/migration/1587101104904-myMigration.ts Le fichier ressemble à ceci.

import {MigrationInterface, QueryRunner} from "typeorm"; 

export class myMigration1587101104904 implements MigrationInterface {      

   public async up(queryRunner: QueryRunner): Promise<any> { 
   } 
   
   public async down(queryRunner: QueryRunner): Promise<any> { 
   } 
}

Ici,

Nous avons deux méthodes up et down. up est utilisée pour ajouter des modifications à la migration et down est utilisée pour annuler les modifications de votre migration.

Ajoutons up méthode à l'intérieur myMigration.ts fichier comme spécifié ci-dessous -

import {MigrationInterface, QueryRunner} from "typeorm"; 

export class Book1587131893261 implements MigrationInterface { 

   public async up(queryRunner: QueryRunner): Promise<any> { 
      await queryRunner.query(`ALTER TABLE book ADD COLUMN price int`); 
   }
   public async down(queryRunner: QueryRunner): Promise<any> { } 
}

Ici,

Nous avons ajouté une nouvelle colonne price à l'intérieur booktable. Maintenant, exécutez la CLI pour ajouter les modifications ci-dessus.

ts-node ./node_modules/typeorm/cli.js migration:run

La commande ci-dessus exécute les migrations et les exécute dans une séquence. Maintenant, vous pouvez voir les changements ci-dessous sur votre écran -

Production

Ouvrez maintenant votre serveur mysql, une nouvelle colonne est ajoutée. Il est montré ci-dessous -

De même, nous pouvons modifier le type de données du titre de la colonne en varchar (30) comme suit,

import {MigrationInterface, QueryRunner} from "typeorm"; 

export class Book1587131893261 implements MigrationInterface { 

   public async up(queryRunner: QueryRunner): Promise<any> { 
   await queryRunner.query(`ALTER TABLE book MODIFY COLUMN title varchar(30)`); 
      } 
   public async down(queryRunner: QueryRunner): Promise<any> { 
   } 
}

Maintenant, exécutez la même commande et vous pourriez les changements ci-dessous -

ts-node ./node_modules/typeorm/cli.js migration:run

Production

Book la table est modifiée comme,

Rétablir la migration

Ajoutons le code ci-dessous à l'intérieur down méthode pour annuler la migration -

import {MigrationInterface, QueryRunner} from "typeorm"; 

export class Book1587131893261 implements MigrationInterface { 
   
   public async up(queryRunner: QueryRunner): Promise<any> { 
   
   } 
   public async down(queryRunner: QueryRunner): Promise<any> { 
      await queryRunner.query(`ALTER TABLE book drop column price`); // reverts things made in "up" method 
   } 
}

Maintenant, exécutez la commande ci-dessous pour annuler toutes les modifications -

ts-node ./node_modules/typeorm/cli.js migration:revert

Vous pouvez voir la réponse suivante -

Production

Book la table est modifiée comme,

Production

Comme nous l'avons vu dans ce chapitre, TypeORM facilite l'écriture d'un script de migration de base de données.