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のマイグレーションについての簡単な説明でした。
最近のコメント