😎

【データベース】Database migrationsとは

2024/12/12に公開

Database migrationsとは

データベーススキーマへの段階的な変更を時間の経過とともに管理及び適用するためのバージョン管理された方法
開発者はテーブルの追加や列の変更などを行うことができる

データベーススキーマとは、データベースの構造を定義したモデルのこと
※例えば、「Todoという名前のテーブルがある」「Todoテーブルには id, name, deadline等カラムがある」「idは数値、nameは文字列、deadlineがDateである」「Userテーブルのインデックスはidである」などをまとめた情報がスキーマである。

マイグレーションの目的

・既存のデータに影響を与えることなく、データベーススキーマを変更する
・データベーススキーマの変更履歴を管理する

実際にマイグレーションを体験してみよう

下記のプロジェクトを使えばマイグレーションを体験できるので、参考にしてください
README.mdにマイグレーションの手順が記載されています
https://github.com/John-Thailand/demo-migration-tools

usersテーブルにはidとnameが列として定義されており、そこにemailを追加する例を記載していきます

1. データベースが入ったコンテナを立ち上げる

まずは docker-compose up -d を実行し、データベースが入ったコンテナを立ち上げます

2. データベーススキーマを変更する

今回はUser.tsemailを追加します

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

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id!: number;

  @Column()
  name!: string;

  // 下記の2行を追加する
  @Column({ unique: true })
  email!: string;
}

3. マイグレーションファイルを作成する

下記コマンドでUserテーブルにemail列を追加するマイグレーションファイルを作成します
yarn typeorm migration:generate src/migration/AddEmailColumnToUserTable -d ./src/data-source.ts を実行します

4. 生成されたマイグレーションファイルを修正する

下記のようにupメソッドではemail列を追加するように設定し、downメソッドではemail列を削除するように設定します。

import { MigrationInterface, QueryRunner } from "typeorm";

export class AddEmailColumnToUserTable1733981258846 implements MigrationInterface {
    public async up(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.query(`
            ALTER TABLE \`users\`
            ADD \`email\` VARCHAR(255) NOT NULL UNIQUE
        `);
    }

    public async down(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.query(`
            ALTER TABLE \`users\`
            DROP COLUMN \`email\`
        `);
    }
}

5. マイグレーションの適用

yarn typeorm migration:run -d ./src/data-source.ts を実行する

6. データベースの確認

MySQLWorkbenchでusersテーブルにemail列が追加されていることを確認しました

Discussion