【Go言語のフレームワークBeego】Migrationの使い方

# Migrationの使い方

この記事の内容

- BeegoのCLIツールでのMigrationファイルの作成
- Migrationファイルの記載
- BeeのコマンドからMigrateを実行する
- BeeのコマンドからMigrateのrollbackやreset、reflesh

## 0.準備
Beego等のバージョンはこんな感じ

```
______
| ___ \
| |_/ /  ___   ___
| ___ \ / _ \ / _ \
| |_/ /|  __/|  __/
\____/  \___| \___| v1.10.0

├── Beego     : 1.11.2
├── GoVersion : go1.12.2
├── GOOS      : linux
├── GOARCH    : amd64
├── NumCPU    : 2
├── GOPATH    : /go
├── GOROOT    : /usr/local/go
├── Compiler  : gc
└── Date      : Friday, 3 May 2019
```

Beegoにはファイルを生成してくれる`bee`コマンドを提供してくれているので使います。
使えない人は下記をインストールしておきます。
`go get -u github.com/beego/bee`
※gomoduleを使ってる人は下記かな？
`GO111MODULE=off get -u github.com/beego/bee` 

## 1.migrationファイルの生成
`bee generate migration テーブル名`を実行すると`database/migrations`フォルダがプロジェクト直下に作成され、中にmigrationファイルが生成される

```
$bee generate migration shikaku_mst
2019/05/03 07:21:47 INFO ▶ 0001 Using 'shikaku_mst' as migration name
create	 /go/src/プロジェクト/database/migrations/20190503_072147_shikaku_mst.go
2019/05/03 07:21:47 SUCCESS  ▶ 0002 Migration successfully generated!
```

## 2.Migrationファイルの記載
作成されたファイルの内容を編集する

```20190503_072147_shikaku_mst.go
package main

import (
	"github.com/astaxie/beego/migration"
)

// DO NOT MODIFY
type ShikakuMst_20190503_072147 struct {
	migration.Migration
}

// DO NOT MODIFY
func init() {
	m := &ShikakuMst_20190503_072147{}
	m.Created = "20190503_072147"

	migration.Register("ShikakuMst_20190503_072147", m)
}

// Run the migrations
func (m *ShikakuMst_20190503_072147) Up() {
	// use m.SQL("CREATE TABLE ...") to make schema update
	// ここにmigrate実行時の内容を記載	
	`CREATE TABLE user(id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255))`)
}

// Reverse the migrations
func (m *ShikakuMst_20190503_072147) Down() {
	// use m.SQL("DROP TABLE ...") to reverse schema update
	// ここにrollback実行時の内容を記載	
	m.SQL("DROP TABLE shikaku_mst")
}
```

## 3.BeeのコマンドからMigrateを実行する

下記のコマンドでmigrationファイルに記載されている内容からMigrateを実行する
`$bee migrate -conn="user:password@tcp(接続先IP:ポート)/DB名"
DefaultのドライバーはMySQLになる

```
$bee migrate -conn="user:password@tcp(接続先IP:ポート)/DB名"
______
| ___ \
| |_/ /  ___   ___
| ___ \ / _ \ / _ \
| |_/ /|  __/|  __/
\____/  \___| \___| v1.10.0
2019/05/03 08:21:23 INFO     ▶ 0001 Using 'mysql' as 'driver'
2019/05/03 08:21:23 INFO     ▶ 0002 Using '/go/src/XXXX/database/migrations' as 'dir'
2019/05/03 08:21:23 INFO     ▶ 0003 Running all outstanding migrations
2019/05/03 08:21:28 INFO     ▶ 0004 |> 2019/05/03 08:21:26.192 [I]  start upgrade ShikakuMst_20190503_072147
2019/05/03 08:21:28 INFO     ▶ 0005 |> 2019/05/03 08:21:26.192 [I]  exec sql: CREATE TABLE user(id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255))
2019/05/03 08:21:28 INFO     ▶ 0006 |> 2019/05/03 08:21:26.224 [I]  end upgrade: ShikakuMst_20190503_072147
2019/05/03 08:21:28 INFO     ▶ 0007 |> 2019/05/03 08:21:26.224 [I]  total success upgrade: 1  migration
2019/05/03 08:21:28 SUCCESS  ▶ 0008 Migration successful!
```

これでDBの構築は完了する。

## 4.BeeのコマンドからMigrateのrollbackやreset、reflesh

BeegoのMigrateでは、DBにMigrationsテーブルを作成しそれぞれのMigrationファイルの実行状況ステータスを記録している。なにかあれば、Migrationsテーブルのレコードを削除すればステータスは初期化出来る。

### ・ロールバック
下記コマンドで最後に実行したmigrateをロールバックすることが出来る。
`bee migrate rollback -conn="user:password@tcp(接続先IP:ポート)/DB名"`


### ・リセット
下記コマンドですべての実行したmigrateをロールバックすることが出来る。
`bee migrate reset -conn="user:password@tcp(接続先IP:ポート)/DB名"`

### ・リフレッシュ
下記コマンドですべての実行したmigrateをロールバックし、再びMigrateすることが出来る。
`bee migrate refresh -conn="user:password@tcp(接続先IP:ポート)/DB名"`


## おまけ
いちいち接続情報を記載するのがめんどくさい場合、beeコマンド用の設定情報は下記に記載可能

`プロジェクト直下/bee.json`

```bee.json
{
  "database": {
      "conn": "user:password@tcp(接続先IP:ポート)/DB名"
  }
}
```