3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Go/goose】HerokuでDBマイグレーション【MySQL】

Last updated at Posted at 2019-08-20

リリースしたら自動でマイグレーションコマンドが実行されてDBスキーマが更新されるようにします。

開発用 PC は mac を想定です。以下、淡々と。

console
# ディレクトリ作成と移動
# 作成するディレクトリは GOPATH 配下ではないようにする
cd heroku-go-migration && cd $_

# go.mod の作成
go mod init $(basename `pwd`)

# main.goの作成
touch main.go
main.go
package main

import (
	"net/http"
	"os"

	"github.com/labstack/echo/v4"
)

var e = createMux()

func init() {
	e.GET("/", func(c echo.Context) error {
		return c.String(http.StatusOK, "Hello World!")
	})
}

func main() {
	port := os.Getenv("PORT")
	if port == "" {
		e.Logger.Fatal("$PORT must be set")
	}

	e.Logger.Fatal(e.Start(":" + port))
}

func createMux() *echo.Echo {
	e := echo.New()
	return e
}

console
# 利用 module を判定
go mod tidy

# direnv のインストール
brew install direnv

# direnv 用の設定を追記
echo 'eval "$(direnv hook bash)"' >> ~/.bash_profile

# シェルを再読み込みして設定を反映
exec $SHELL -l

# .envrc の作成
echo 'export PORT=3000' >> .envrc

# (一応) .gitignoreの作成
echo '.envrc' >> .gitignore

# direnv で環境変数の読み込み
direnv allow

# アプリケーションのテスト起動(バックグラウンド)
go run main.go &

# ブラウザで表示
open http://localhost:3000

# アプリケーションのプロセスを終了
kill $(ps | grep "go run main.go" | cut -d " " -f 1 | head -n 1)
kill $(ps | grep "go-build" | cut -d " " -f 1 | head -n 1)

# heroku-cli のインストール
brew tap heroku/brew && brew install heroku

# heroku にサインアップ
open https://signup.heroku.com/

# heroku-cli で heroku にログイン
heroku login -i

# アプリケーション名を変数に格納
# (注)ごちゃごちゃやってますが任意の文字列で構いません。
# (注)大文字は使えません。
export HEROKU_APP_NAME=$(echo `whoami`-`basename $(pwd)` | awk '{print tolower($0)}')

# アプリケーション名を確認
echo $HEROKU_APP_NAME

# heroku アプリケーションの作成
heroku create $HEROKU_APP_NAME --buildpack heroku/go

# Procfile の作成
echo "web: $(basename `pwd`)" > Procfile

# git リポジトリの作成
git init
git add .
git commit -m "Initial commit"

# push 先を登録
heroku git:remote --app $HEROKU_APP_NAME

# デプロイ
git push heroku master

# 確認
heroku open --app $HEROKU_APP_NAME

# heroku mysql addon を追加
heroku addons:add cleardb

# DATABASE_URL の確認
heroku config | grep DATABASE_URL

# DATABASE_URLは次のような構造になっている。
# mysql://ユーザ名:パスワード@ホスト名/データベース名?reconnect=true
# ユーザ名・パスワード・ホスト名・データベース名をそれぞれ抽出して以下の環境変数に設定する
heroku config:set USER="ユーザ名"
heroku config:set PASSWORD="パスワード"
heroku config:set Host="ホスト名"
heroku config:set DBNAME="データベース名"
heroku config:set GOOSE_CONNECTION="tcp:ホスト名:3306*データベース名/ユーザ名/パスワード"

# 環境変数の確認
heroku config

# goose のダウンロード
go get -u bitbucket.org/liamstask/goose/cmd/goose

# ディレクトリ作成
mkdir db

# 設定ファイルのサンプルをコピーして配置
# 途中のパスは各々の環境に合わせること
cp $GOPATH/pkg/mod/bitbucket.org/liamstask/goose@vX.X.X-XXXXXXXX-XXXXXXXX/db-sample/dbconf.yml db/

db/dbconf.yml の production の箇所を次のように編集する。

db/dbconf.yml
・・・・・・

production:
  driver: mymysql
  open: $GOOSE_CONNECTION

・・・・・・
console
# マイグレーションファイルを作成
goose create create_table_users sql

作成された db/migrations/xxxxxxxx_create_table_users.sql を編集する。

db/migrations/xxxxxxxx_create_table_users.sql

-- +goose Up
-- SQL in section 'Up' is executed when this migration is applied
CREATE TABLE users (
    id INT AUTO_INCREMENT,
    name VARCHAR(50),
    PRIMARY KEY(id)
);

-- +goose Down
-- SQL section 'Down' is executed when this migration is rolled back
DROP TABLE users;
console
# go.mod を整理
go mod tidy

go.mod の 1, 2 行目に次のように追記する。

go.mod
+ // +heroku install ./... bitbucket.org/liamstask/goose/cmd/goose
+
  module heroku-go-migration

  go 1.12

  require github.com/labstack/echo/v4 v4.1.10
console
# Procfile の 2 行目にリリース時に実行したいコマンドを追記
echo 'release: goose -env production up' >> Procfile

# ここまでの変更内容をコミット
git add .
git commit -m "Second commit"

# デプロイ
git push heroku master

デプロイ時のログに次のような内容があることを確認する。

remote: Verifying deploy... done.
remote: Running release command...
remote: 
remote: goose: migrating db environment 'production', current version: 0, target: xxxxxxxxxxxxxx
remote: OK    xxxxxxxxxxxxxx_create_table_users.sql
remote: Waiting for release.... done.

控えたユーザ名・パスワード・ホスト名・データベース名を利用して、SQLクライアントからデータベースに接続して確認する。

Image from Gyazo

Image from Gyazo

3
3
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
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?