Edited at

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

More than 1 year has passed since last update.


概要



  • 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を導入!

(ブログ記事と本記事の内容は若干異なります)