web-application-framework nestjs

NestJSアプリケーションでTypeORMのマイグレーションを実行する方法についてまとめました。
本記事ではMySQLを使用します。

サムネイル

前提

環境

  • Ubuntu 24.04.3 LTS (WSL2ディストリビューション)
  • Docker Engine 28.4.0
  • Docker Compose 2.39.4
  • Amazon Linux 2023(DockerコンテナのOS)
  • Node.js 24.13.1
  • NestJS 11.0.1
  • NGINX 1.28.2
  • MySQL 8.4.7
  • @nestjs/typeorm 11.0.0

前提

セットアップ手順

  1. TypeORMを設定する
  2. DataSourceを作成する
  3. Userリソースを作成する
  4. マイグレーションを作成する
  5. マイグレーションを実行する

1. TypeORMを設定する

NestJSプロジェクトにTypeORMを設定します。
NestJSでMySQLに接続する方法【TypeORMで実装例付き】」を参照してください。

上記の記事に従って database.config.ts を作成した場合、synchronize の値を false に変更してください。
これはマイグレーションを使用するために必須です。

database.config.ts:

import { registerAs } from '@nestjs/config';

export default registerAs('database', () => getDatabaseConfig());

export const getDatabaseConfig = () => ({
  host: process.env.DATABASE_HOST,
  port: process.env.DATABASE_PORT === undefined ? undefined : +process.env.DATABASE_PORT,
  username: process.env.DATABASE_USERNAME,
  password: process.env.DATABASE_PASSWORD,
  database: process.env.DATABASE_DATABASE,
  synchronize: false, // falseに変更する
})

2. DataSourceを作成する

データベース接続設定を保持するためのDataSourceを作成します。

src/app-data-source.ts:

import * as dotenv from 'dotenv'
import { DataSource } from 'typeorm'
import { getDatabaseConfig } from './config/database.config';

dotenv.config()

const databaseConfig = getDatabaseConfig()

export const AppDataSource = new DataSource({
    type: 'mysql',
    ...databaseConfig,
    migrations: [__dirname + '/db/migrations/*{.js,.ts}'],
})

データベース設定に process.env を使用している場合は設定を読み込む前に dotenv.config() を呼び出して process.env を初期化してください。

src ディレクトリでマイグレーションをTypeScriptのみで作成している場合でも、migrations オプションには .js を含める必要があります。
ビルド時に dist ディレクトリ内でJavaScriptへコンパイルされるためです。

3. Userリソースを作成する

テスト用にUserリソースを作成します。
Userリソースを作成する」を参照してください。

4. マイグレーションを作成する

以下のコマンドを実行して user マイグレーションファイルを作成します。

$ npx typeorm migration:create src/db/migrations/user

src/db/migrations ディレクトリに <Timestamp>-user.ts が生成されます。

テーブルを作成・削除するロジックを追加します。

<Timestamp>-user.ts:

import {
    MigrationInterface,
    QueryRunner,
    Table,
} from "typeorm"

export class User1770805968508 implements MigrationInterface {

    public async up(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.createTable(
            new Table({
                name: "user",
                columns: [
                    {
                        name: "id",
                        type: "int",
                        isPrimary: true,
                        isGenerated: true,
                        generationStrategy: "increment",
                    },
                    {
                        name: "name",
                        type: "varchar",
                    },
                ],
            }),
            true,
        )
    }

    public async down(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.dropTable("user", true)
    }

}

isPrimary: true はそのカラムを主キーに設定します。

isGenerated: truegenerationStrategy: "increment"auto_increment を有効にします。

5. マイグレーションを実行する

以下のコマンドでマイグレーションを実行します。

$ npx typeorm-ts-node-commonjs migration:run -d ./src/app-data-source.ts

MySQLに user テーブルが作成されていることを確認します。

mysql> show columns from user;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int          | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | NO   |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+

変更を元に戻したい場合は以下のコマンドを実行してください。

$ npx typeorm-ts-node-commonjs migration:revert -d ./src/app-data-source.ts

関連記事