Node.jsを使ったMigration機能を使ってみた

#はじめに
自宅のPC、ノートパソコン、研究室のPCで開発することがあり、ソースコードはGitで管理しているからストレスはないが、
DBは手動で書き換えを行っており、書き換え忘れによるバグや変更点を思い出すので無駄な時間がかかる
そんな時バイト先でRubyやCakePHPなどにはMigrationという機能があるということを聞いて、Node.jsを使ってやってみたいと思い調べてみた
Node.jsを使ってのMigrationの記事が少なかったので書いてみようと思う
※OSはWindows,MacOSで行いました


#データベースマイグレーションとは
データベースを削除してから作り直すと、DBに保存されている情報が全て削除されてしまう
こういった事態を回避する方法として、データベースマイグレーションを行う方法がある
マイグレーションとは、DBに保存されているデータを保持したまま、テーブルの作成やカラムの変更などを行うための機能
詳しいことは[こちら](http://www.rubylife.jp/rails/model/index5.html)などを呼んでください

#前提
+ npmが実行できる環境が整っている
+ MySQLを使える環境が整っている

#Node.jsでMigrationを行う
Migrationが行えるモジュールはたくさんあるが、今回はいろいろ試してうまくいった`db-migrate`モジュールを利用する

##プロジェクトを作成する

```
$ mkdir プロジェクト名
$ cd プロジェクト名
$ npm init
// Enter連打
```

##db-migrateをインストール
db-migrateコマンドを利用するのでグローバルにインストールする

```
$ npm install -g db-migrate
```

下記のコマンドを実行

```
$ db-migrate
```

以下の画像が表示されたらインストール成功

![skitch (3).png](https://qiita-image-store.s3.amazonaws.com/0/130026/e675173e-888b-c765-0608-6c4e87630172.png)



##DBの情報を設定ファイルに記述
プロジェクト名ディレクトリの中に`database.json`ファイルを作成する
ここにMigrationを行うDBの情報を記述する

```
$ pwd
/Users/Hoge/プロジェクト名
$ touch database.json
```

設定するデータベースを作成する

```
$ mysql.server start
$ mysql -u root -p
password


mysql> create database migration;
```

database.jsonに設定を記述する

```database.json
{
    "dev": {
        "driver": "mysql", //DBの種類
        "user": "root", //ログインするユーザ名
        "password": "root", //ユーザのパスワード
        "database": "migration" //Migrationを行うデータベース名
    }
}
```

##Migrationファイルを作成する

下記のコマンドを実行して以下の画像のように表示されればMigrationファイルの作成に成功
失敗する場合、設定ファイルがうまくいっていない可能性あり

```
$ db-migrate create create_table_hoge
```

![skitch (2).png](https://qiita-image-store.s3.amazonaws.com/0/130026/0576d409-da53-1d45-a2be-ad715deeb527.png)


プロジェクト名/migrations　ディレクトリにMigrationファイルが作成されている


##MigrationファイルにDBの操作を記述する
作成した時間-createコマンドでの引数名.jsファイルにDBの操作を記述していく
(上記のコマンドの場合、例：20170212082607-create-table-hoge.js)

```20170212082607-create-table-hoge.js
'use strict';

var dbm;
var type;
var seed;

/**
  * We receive the dbmigrate dependency from dbmigrate initially.
  * This enables us to not have to rely on NODE_PATH.
  */
exports.setup = function(options, seedLink) {
  dbm = options.dbmigrate;
  type = dbm.dataType;
  seed = seedLink;
};

exports.up = function(db) {
  /**
    * 以下のコードを記述
    */
  db.createTable('hoge', {
    id: {type: 'int', primaryKey: true},
    name: 'string'
  });
  return null;
};

exports.down = function(db) {
  /**
    * 以下のコードを記述
    */
  db.dropTable('hoge');
  return null;
};

exports._meta = {
  "version": 1
};
```


##Migrationファイルを利用してDBを操作する
`db-migrate`がDBの操作を行うにはdriverが必要みたいなのでインストールする
(ローカルで大丈夫)

```
$ npm install db-migrate-mysql
```

upコマンドを使ってexports.up()メソッドの中身を実行する

```
$ db-migrate up
```

以下のように表示されたら成功
失敗した場合、ログインしたユーザ名やパスワード、そのユーザの権限などに原因がある可能性あり

<img width="428" alt="skitch (1).png" src="https://qiita-image-store.s3.amazonaws.com/0/130026/01278555-b03f-a606-a77c-a527b8fb98d6.png">



変更が行われているか確認する

```
mysql> use migration
mysql> show tables;
テーブルが作成されていることを確認
mysql> show columns from hoge;
カラムが正しいか確認
```

downコマンドを使ってexports.down()メソッドの中身を実行する

```
$ db-migrate down
```

以下のように表示されたら成功

<img width="434" alt="skitch.png" src="https://qiita-image-store.s3.amazonaws.com/0/130026/a1bf904f-2a71-c0f5-f2f1-15f856983e26.png">


変更が行われているか確認する

```
mysql> show tables;
テーブルが消えてることを確認
```

#最後に
省いたところも多くありますが、出来る限り丁寧に書きました
カラムの追加や削除などは以下の参考サイトに記載されているので、気になる人は見てください
DBへの操作(テーブルの作成やカラムの変更)を行うたびにcreateコマンドを使ってMigrationファイルを作成するようです
よって`db-migrate create 操作する名前`などが良いみたい
upやdownの操作の履歴はmigrationsテーブルに残してるそうです
この記事内以外でも質問があれば、コメントやTwitter、メールなどをください







#参考サイト
[ハードコイルド・ワンダーランド|node-db-migrate便利](http://weathercook.hatenadiary.jp/entry/20121129/1354155639)
[db-migrate](https://db-migrate.readthedocs.io/en/latest/Getting%20Started/the%20commands/)