107
101

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2018-01-11

概要

  • 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

いっつそーいーじー

備考

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

所感

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

107
101
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
107
101

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?