TypeORMのマイグレーションについて

TypeORMのマイグレーションの概要についてです。

TypeORMでは、DBのテーブルを表すEntityと、実際のテーブルの差分を検知してマイグレーションファイルを作成することができます。

まだテーブルを作成していない状態です。(マイグレーションの状態を保持するmigrationsテーブルのみ)

mysql> show tables;
+-------------------+
| Tables_in_typeorm |
+-------------------+
| migrations        |
+-------------------+
1 row in set (0.00 sec)

UserとBookという二つのEntityを作成します。

import {Entity, PrimaryGeneratedColumn, Column, BaseEntity} from "typeorm";

@Entity()
export class User{

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    firstName: string;

    @Column()
    lastName: string;

    @Column()
    age: number;

}
import {Entity, PrimaryGeneratedColumn, Column} from "typeorm";

@Entity()
export class Book {

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    title: string;

}

以下のコマンドを実行すると、実際のテーブルとEntityの差分からマイグレーションファイルが作成されます。

ts-node ./node_modules/.bin/typeorm migration:generate -n Test

-n Test で、マイグレーションにTestという名前をつけています。

コマンドを実行すると、migrations ディレクトリの下にファイルがマイグレーションファイルが作成されます。

import {MigrationInterface, QueryRunner} from "typeorm";

export class Test1616578799718 implements MigrationInterface {
    name = 'Test1616578799718'

    public async up(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.query("CREATE TABLE `book` (`id` int NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB");
        await queryRunner.query("CREATE TABLE `user` (`id` int NOT NULL AUTO_INCREMENT, `firstName` varchar(255) NOT NULL, `lastName` varchar(255) NOT NULL, `age` int NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB");
    }

    public async down(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.query("DROP TABLE `user`");
        await queryRunner.query("DROP TABLE `book`");
    }

}

次にマイグレーションを実行します。

ts-node ./node_modules/.bin/typeorm migration:run

まだ実行していないマイグレーションファイルが実行されて、テーブルが作成されます。

mysql> show tables;
+-------------------+
| Tables_in_typeorm |
+-------------------+
| book              |
| migrations        |
| user              |
+-------------------+
3 rows in set (0.00 sec)

migrations テーブルも更新されます。

mysql> SELECT * FROM migrations;
+----+---------------+-------------------+
| id | timestamp     | name              |
+----+---------------+-------------------+
|  3 | 1616578799718 | Test1616578799718 |
+----+---------------+-------------------+
1 row in set (0.00 sec)

ロールバックしたい場合は、migration:revert を実行します。

ts-node ./node_modules/.bin/typeorm migration:revert

userとbookテーブルがdropされます。

mysql> show tables;
+-------------------+
| Tables_in_typeorm |
+-------------------+
| migrations        |
+-------------------+
1 row in set (0.00 sec)

TypeORMのマイグレーションについての簡単な説明でした。