マイグレーションファイルが増えないridgepoleのすごさ
LaravelやRailsで開発しているとマイグレーションファイルがどんどん増えていきます。
それ自体は正しい運用なのですが、「過去の変更点はGitのコミットログで分かるのだから、都度新しいファイルを足していくのは微妙だなあ」と思わなくもないです。
この点、マイグレーションの冪等性を保ってくれるridgepoleというRuby製のツールがあることを知り、試したところ感動したので紹介します。
ridgepoleは現在のテーブルの状態とファイル上のテーブル定義の差分を埋めるように適切なクエリを発行してくれます。
百聞は一見にしかずと言いますので実際に動かしてみましょう。
Dockerで簡易的なハンズオンキットを用意しました。
ridgepoleを使ってPostgreSQLをマイグレートするハンズオンです。
Dockerfileはこちら。
下記の手順でハンズオンを実施できます。
git clone https://github.com/dyoshikawa/hands-on-ridgepole
cd hands-on-ridgepole
docker-compose up -d
docker-compose exec app sh
テーブル定義が書かれたSchemafileは次のようにしています。
create_table "users", force: true do |t|
t.string "name", null: false
end
では、appコンテナの中に入った状態で早速ridgepoleを実行してみましょう。
ridgepole --config database.yml --file Schemafile -E development --apply
Apply `Schemafile`
-- create_table("users", {})
-> 0.0137s
usersテーブルが作成できました。
続いて、カラムを足してみます。
Schemaファイルを編集します。
vi Schemafile
次のようにします。
create_table "users", force: true do |t|
t.string "name", null: false
t.string "email", null: false, unique: true
end
emailカラムの行を追加しました。
Schemafileを保存してから再びridgepoleコマンドを叩くと、
ridgepole --config database.yml --file Schemafile -E development --apply
Apply `Schemafile`
-- add_column("users", "email", :string, {:null=>false, :unique=>true})
-> 0.0033s
このようにadd_columnを実行してくれます。
次はnameカラムを抜いてみます。
create_table "users", force: true do |t|
t.string "email", null: false, unique: true
end
この状態で実行すると、
ridgepole --config database.yml --file Schemafile -E development --apply
Apply `Schemafile`
-- change_column("users", "email", :string, {:null=>false, :unique=>true, :default=>nil})
-> 0.0060s
-- remove_column("users", "name")
-> 0.0028s
remove_columnを実行してくれます。
非常に使い勝手が良いと感じたので実際のプロジェクトでも採用できればと思っています。
ただ、依存関係のあるRubyパッケージを必要とする点が、Rails以外のプロジェクトではやや不便です。
これも克服できそうなのがつい最近登場したsqldefというOSSです。
作者の方のブログによると「バイナリポン」で使えること、また、RubyのDSLではなくSQLの文法でテーブル定義を行うことを志向しているようです。
こちらも機会があれば試してみたいと思います。