Go言語でマイグレーションどうやんの…というところで色々試したうちの1つ。
Railsのrake db:migration
みたいな事ができるので、Railsに慣れている人には比較的使いやすいのではないかと思う。
環境
go 1.13.4
gooseが記事執筆時点で対応しているデータベース
- postgres
- mysql
- sqlite3
- mssql
- redshift
gooseのインストール
go get -u github.com/pressly/goose/cmd/goose
各種コマンド
databaseを作る
db:create相当のコマンドは無い
マイグレーションファイルを作る
$ goose mysql "user:password@/testdb?parseTime=true" create AddColumnToTestTable sql
2020/03/15 11:10:29 Created new file: 20200315111029_AddColumnToTestTable.sql
すると以下のようなファイルが出力されるので、中身のSQL文は自分で書く。
Railsほどいい感じにテンプレート出力されるわけではない。
-- +goose Up
-- SQL in this section is executed when the migration is applied.
-- +goose Down
-- SQL in this section is executed when the migration is rolled back.
マイグレーションを実行する
-- +goose Up
セクションに記載された内容が実行される。
# 1つだけ実行
goose mysql "user:password@/testdb?parseTime=true" up-by-one
# まだ実行してないものを全部実行
goose mysql "user:password@/testdb?parseTime=true" up
# 特定のバージョンまで実行
# そのバージョンも含む
goose mysql "user:password@/testdb?parseTime=true" up-to 20200315111029
巻き戻し
-- +goose Down
セクションに記載された内容が実行される。
# 最初まで巻き戻し
goose mysql "user:password@/testdb?parseTime=true" down
# 特定のバージョンまで巻き戻し
# 指定したバージョンは含まない
goose mysql "user:password@/testdb?parseTime=true" down-to 20200315111029
再実行
特定のマイグレーションをdown
してからup
する。
goose mysql "user:password@/testdb?parseTime=true" redo 20200315111029
欠点
コマンドラインにパスワードを含むのでDBのパスワードがコマンド履歴に残る。
BitBucketのほうのGooseは設定ファイルに書けるらしい。