概要
- 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
いっつそーいーじー
備考
カラムの削除・追加、テーブルの削除などはスキーマファイルいじるだけでいい。
所感
使ってみると思ったより快適で満足しています。
早くやればよかったんじゃ...