go modules環境でgolang-migrate/migrateを動かす
goを始めたのはいいがmodules周りがよくわからず、migrationしたいだけなのに手間取ったのでメモ
tl;dr
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を参照ください
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 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.md
にmysqlに接続する際のサンプルが書いてますので、これを参考に実行してみます
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はあんまり関係なかったです。すいません。。
今回使用したコードは以下のリポジトリに入れてありますのでよければ