Help us understand the problem. What is going on with this article?

【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名"
  }
}
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away