【Go/goose】Heroku에서 DB 마이그레이션 【MySQL】
개발 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/[email protected]/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 클라이언트에서 데이터베이스에 연결하고 확인합니다.
Reference
이 문제에 관하여(【Go/goose】Heroku에서 DB 마이그레이션 【MySQL】), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/rema424/items/74a8b03adddb14ec280b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)