はじめに
最近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関係の設定を行う
- package.jsonのscripts部分に以下を追加する
"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の内容を追加する
// 予め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.で作成したファイルをのぞいてみると、ある程度ひな型がすでにできています。
import { MigrationInterface, QueryRunner } from "typeorm";
export class [filename][TIMESTAMP] implements MigrationInterface {
async up(queryRunner: QueryRunner): Promise<any> {
}
async down(queryRunner: QueryRunner): Promise<any> {
}
}
※formatterを使っている人は初期状態だとめちゃめちゃ怒られるかもしれません
ひな型にはup
とdown
があり、migrationを実行する際はup
の中身が実行され、migrationで実行した内容を元に戻す際はdown
の中身が実行されます。
試しに「staffというtableのcolumnであるiconの名前をimageに変更する」という処理を書いてみます。
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について触っていないので不備がかなりあると思いますが、誰かしらのお役に立てられれば幸いです。