LoginSignup
15
8

More than 3 years have passed since last update.

NestJSでTypeORMを使ってmigrationを試してみる

Last updated at Posted at 2019-11-08

はじめに

最近MySQLに触る機会があったのですが、「migrationできるようにして欲しい」と頼まれ、「migrationって何ぞや?」となったので備忘録としてこの記事を書きました。
自分もDB初心者なので、同じような方向けです

環境

  • windows10 Pro
  • nestjs 6.7.2
  • typeorm 0.2.19
  • ts-node 8.1.0

早速migrationに触れてみる

migrationについて

migrationとはDBに保存されているデータを保持しながらカラムを変更したりテーブルを作成したりするための機能です。
「このテーブル追加したい...」「この要素はいらなかったなぁ...」というときにDBを削除して作り直すのではなく、migrationファイルを基にDBのスキーマ等を変更することができる便利なものです。

注意
基本的にDBが既に作成されている前提で手順を書いています。
nestjsにおけるDBの触り方は公式のドキュメントが参考になると思います。
NestJS公式ドキュメント

1.必要なライブラリを入れる

npm install typeorm
npm install ts-node
この2つが必要になります

2.config関係の設定を行う

  1. package.jsonのscripts部分に以下を追加する
package.json
"scripts": {
     // スクリプト一覧
   "typeorm": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js --config ormconfig.js"

migrationの設定に関しては--config ormconfig.jsの部分でormconfigを参照させるようにしています。
2. ormconfig.jsにmigrationの内容を追加する

ormconfig.js
// 予めmigrationディレクトリを用意しておく
// 筆者はtypescriptで書いているため*.tsとなっている
migrations: ['src/migration/*.ts'],
  cli: {
    'migrationsDir': 'src/migration'
  }

3.migrationファイルを作成する

migrationファイルは以下のコマンドで作成できます。
npm run typeorm migration:create -- -n [filename]
ここのfilenameは任意のもので大丈夫だと思います。
コマンドを実行すると[unixtime]-[filename].tsというファイルが生成されます。名前のunixtimeは作成時刻をunixtimeにしたものです。

4. migrationファイルを編集する

実際にデータベース対する変更の処理を書いていきたいと思います。
3.で作成したファイルをのぞいてみると、ある程度ひな型がすでにできています。

[unixtime]-[filename].ts
import { MigrationInterface, QueryRunner } from "typeorm";

export class [filename][TIMESTAMP] implements MigrationInterface {    
    async up(queryRunner: QueryRunner): Promise<any> {        
    }

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

※formatterを使っている人は初期状態だとめちゃめちゃ怒られるかもしれません

ひな型にはupdownがあり、migrationを実行する際はupの中身が実行され、migrationで実行した内容を元に戻す際はdownの中身が実行されます。

試しに「staffというtableのcolumnであるiconの名前をimageに変更する」という処理を書いてみます。

111111-test.ts
import { MigrationInterface, QueryRunner } from "typeorm";

export class test111111 implements MigrationInterface {    
    async up(queryRunner: QueryRunner): Promise<any> {   
        await queryRunner.renameColumn('staff', 'icon', 'image');
    }

    // 元に戻す処理なのでupと反対の処理を記述
    async down(queryRunner: QueryRunner): Promise<any> {   
        await queryRunner.renameColumn('staff', 'image', 'icon');      
    }
}

QueryRunnerを用いることで簡単にDBに対する操作を記述することができます。renameの他にもさまざまな処理が可能になっています。
公式ドキュメント
また、新たにmigrationを実行する際には再度3.のコマンドでmigrationファイルを作成する必要があります。

5.migrationを実行する

  • upの内容を実行するには以下のコマンドを叩く
    npm run typeorm migration:run
    このコマンドを叩くと、(保留も含む)実行されていない全てのmigrationを時系列順に実行します
    なので何かしらの処理が保留状態になっていたりするとそれも実行されます。

  • downの内容を実行するには以下のコマンドを叩く
    npm run typeorm migration:revert
    このコマンドを叩くと最後に実行されたmigrationファイルのdownの内容が実行されます
    なので新規でmigrationファイルを作成してnpm run typeorm migration:revertを行っても:runをしていなければ、1つ前のmigrationファイルのdownが実行されます。
    また、:revertは1回前に戻すだけなので、複数前のバージョンに戻す際は回数分:revertを実行する必要があるみたいです。

最後に

少ししかmigrationについて触っていないので不備がかなりあると思いますが、誰かしらのお役に立てられれば幸いです。

15
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
8