ゆずめも

メモ的なブログです。主に勉強した事について書いてます。

go modules環境でgolang-migrate/migrateを動かす

goを始めたのはいいがmodules周りがよくわからず、migrationしたいだけなのに手間取ったのでメモ

github.com

tl;dr

  • cliをインストール
  • migration用のファイルを書く
  • mysqlの起動
  • mysqlに対してmigrate実行

cliのインストール

そもそもmigrateはcliで実行することもできるし、プログラムを書いて実行することもできるみたい

可能な限りコードは書きたく無い精神で今回はcliを試していきます

インストール

macであれば以下のコマンドでインストールできます

brew install golang-migrate

開発環境はmacですが一応環境に縛られない方法でためそうと思いgo getで取得する方法でチャレンジします

go mod init
go get -tags 'mysql' -u github.com/golang-migrate/migrate/cmd/migrate

もっと詳しく知りたい方は以下のURLを参照ください

github.com

migration用のファイルを書く

今回はmigrateディレクトリを作成し、その中にmigration用のファイルを作成していきます

migrate公式が書いているベストプラクティスを見ると以下の方式でソートできるようにバージョンをつけるといいみたいです*1

{version}_{title}.up.{extension}
{version}_{title}.down.{extension}

イメージとしては{version}に連番を振るかtimestampを使うのが推奨されてるようです

1_initialize_schema.down.sql
1_initialize_schema.up.sql
2_add_table.down.sql
2_add_table.up.sql
...

# or

1500360784_initialize_schema.down.sql
1500360784_initialize_schema.up.sql
1500445949_add_table.down.sql
1500445949_add_table.up.sql
...

今回は連番で書くことにします

upの処理を書く

migrateディレクトリ内に1_initialize_schema.up.sqlを作成し、以下のようにtableを作成するSQLを記述します

create table nogizaka (
    id integer auto_increment primary key,
    name varchar(40),
    height integer
)

downの処理

migrateディレクトリ内に1_initialize_schema.down.sqlを作成し、upの時に作ったものを打ち消す処理を記述します

drop table nogizaka

もしalter tableしたのなら、そのalter tableを打ち消すalter table書くみたいな感じですね

mysqlの起動

dockerを使用して、mysqlを起動します

Docker Hub

docker run --name test-mysql -e MYSQL_ROOT_PASSWORD=asuka -e MYSQL_DATABASE=sakamichi -d -p 3306:3306 mysql:8.0

mysqlに対してmigrate実行

database/mysql/README.mdmysqlに接続する際のサンプルが書いてますので、これを参考に実行してみます

github.com

migrate -source file://migrate/ -database 'mysql://root:asuka@tcp(127.0.0.1:3306)/sakamichi' up 1

これでmysql workbenchやmycliなどを使用してmysqlにアクセスするとsakamichiデータベースにnogizakaテーブルが作成されています

mycli -u root -h 127.0.0.1 sakamichi #password: asuka

次にdownを試してみます

migrate -source file://migrate/ -database 'mysql://root:asuka@tcp(127.0.0.1:3306)/sakamichi' down 1

実行後再度mysqlでテーブルの一覧を確認するとsakamichiテーブルがdropされています

まとめ

最初はmigrateのcliのインストール方法がよくわからずつまずきましたが、結果的にはgo modulesはあんまり関係なかったです。すいません。。

今回使用したコードは以下のリポジトリに入れてありますのでよければ

github.com