Rails マイグレーションの廃止とRidgepoleの導入・利用方法

概要

  • lismoaついにマイグレーションやめるってよ
  • クックパッドが使ってるRidgepoleというスキーマ管理用のコマンドラインツールを使おうぜ
  • Ridgepoleクックパッドのエンジニアが作っとるやんやばー
  • 結構使いやすいやんやばー
  • 使い方解説します

マイグレーション廃止の理由

昨今のlismoa多機能化に伴いRailsプロジェクトが複数に分裂してきました。
現在のプロジェクトは以下の4つです。

  • app(本体)
  • batch(バッチ用)
  • api(他システム連携用)
  • admin(管理用)

これらのプロジェクト全てで同じDBを参照しています。
そうすると各プロジェクトごとのマイグレーションファイルを同状態に揃えないとDBの完全な整合性が取れないという問題が生じてしまいます。
この対応として、今までは定期的に全プロジェクトのマイグレーションファイルとモデルを揃える作業をしていました。

これが非常にナンセンスで手間がかかる!
マイグレーションファイルが増えすぎててわやくちゃ!

ということでRidgepoleの導入に至ったわけです。

そもそもRidgepoleとは?

スキーマ管理用のコマンドラインツールだそうです。
シンプルに言えば簡単にテーブルの作成、変更、削除ができる便利なものです。
クックパッドが使ってるから信頼していいでしょう。(盲目)
というか作ったのがクックパッドですし。
詳しくはこちらを参照してください。
クックパッドにおける最近のActiveRecord運用事情

利用方法

今回は例としてusersテーブルを作成します。

導入

gemが公開されているのでGemfileに記述します。
ridgepole
バージョンは必要であれば指定しましょう。

# Gemfile
gem 'ridgepole'

そしていつものbundle installを実行。

モデルジェネレート

マイグレーションは不要なのでスキップするのを忘れないように!

$ rails g model amazonFlatFile --skip-migration

テーブルの定義ファイル

詳しい記述方法は以下を参照してください。
ridgepole

1ファイルで管理する場合


Schemafileにテーブル定義を記述します。
# /{project}/db/Schemafile
create_table "users", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
  t.bigint "team_id"
  t.string "name"
  t.string "email"
  t.datetime "created_at", default: ->; { "CURRENT_TIMESTAMP" }, null: false
  t.timestamp "updated_at", default: ->; { "CURRENT_TIMESTAMP" }, null: false
  t.index ["team_id"], name: "index_team_id_on_users"
end

以上で準備完了。

テーブルごとにファイル分けする場合


/{project}/db配下に``.schema拡張子のファイルを作成します。
# /{project}/db/users.schema
create_table "users", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
  t.bigint "team_id"
  t.string "name"
  t.string "email"
  t.datetime "created_at", default: ->; { "CURRENT_TIMESTAMP" }, null: false
  t.timestamp "updated_at", default: ->; { "CURRENT_TIMESTAMP" }, null: false
  t.index ["team_id"], name: "index_team_id_on_users"
end

Schemafileでrequireします。

# /{project}/db/Schemafile
require 'users.schema'

以上で準備完了。

実行

以下のコードを実行します
-E developmentの部分は適宜変更しましょう。

$ bundle exec ridgepole -c config/database.yml -E development --apply -f db/Schemafile

結果

成功するとこんな感じになります。

$ bundle exec ridgepole -c spec/dummy/config/database.yml -E development --apply -f db/Schemafile
Apply db/Schemafile
-- create_table("amazon_flat_files", {:options=>"ENGINE=InnoDB DEFAULT CHARSET=utf8"})
-> 0.0308s
-- add_index("amazon_flat_files", ["sales_platform_id"], {:name=>"index_amazon_flat_files_on_sales_platform_id"})
-> 0.0173s

いっつそーいーじー

備考

カラムの削除・追加、テーブルの削除などはスキーマファイルいじるだけでいい。

所感

使ってみると思ったより快適で満足しています。
早くやればよかったんじゃ...

ブログで見たい方はこちら → lismoaマイグレーション廃止! Ridgepoleを導入!
(ブログ記事と本記事の内容は若干異なります)

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.