Help us understand the problem. What is going on with this article?

Ridgepoleを使ってみた

More than 3 years have passed since last update.

はじめに

RailsでのDBスキーマ管理としてRidgepoleを勧められたため、触ってみました。
↓こちらの方の記事を参考にさせていただきました。
さらば「rails migrate」、よろしく「ridgepole」

導入

Gemfileに追記します。

Gemfile
gem 'ridgepole'
$ bundle install

今回使用するテーブル

class CreateItems < ActiveRecord::Migration[5.0]
  def change
    create_table :items do |t|
      t.string :name
      t.integer :price
      t.text :description

      t.timestamps
    end
  end
end

Schemafileの作成

そして、下記のコマンドでテーブルを分割します。
--exportコマンドで対象ディレクトリにSchemafileを出力します。

$  ./bin/bundle exec ridgepole -c config/database.yml -E development --export --split --output db/schemas/Schemafile
Export Schema
  write `db/schemas/items.schema`
  write `db/schemas/Schemafile`

これで、各テーブルのスキーマファイルと大元のSchemafileが作成されます。

Schemafile
require 'items.schema'
items.schema
create_table "items", force: :cascade do |t|
  t.string   "name"
  t.integer  "price"
  t.text     "description"
  t.datetime "created_at",  null: false
  t.datetime "updated_at",  null: false
end

インデックスを追加してみる

items.schema
create_table "items", force: :cascade do |t|
  t.string   "name"
  t.integer  "price"
  t.text     "description"
  t.datetime "created_at",  null: false
  t.datetime "updated_at",  null: false
end
+ add_index :items, :price

実行するためには、以下のコマンドを叩きます。

$ ./bin/bundle exec ridgepole -c config/database.yml -E development --apply -f db/schemas/Schemafile
Apply `db/schemas/Schemafile`
-- add_index("items", ["price"], {})
   -> 0.0113s

これだけで、index_items_on_priceというインデックスが作成されました。

カラムを追加してみる

items.schema
create_table "items", force: :cascade do |t|
  t.string   "name"
  t.integer  "price"
  t.text     "description"
+ t.integer  "category", null: false, default: 0
  t.datetime "created_at",  null: false
  t.datetime "updated_at",  null: false
end
  add_index :items, :price

わざわざマイグレーションを作成しなくてもカラムが追加できました。

$ ./bin/bundle exec ridgepole -c config/database.yml -E development --apply -f db/schemas/Schemafile
Apply `db/schemas/Schemafile`
-- add_column("items", "category", :integer, {:null=>false, :default=>0, :after=>"description"})
   -> 0.0151s

おわりに

これだけ簡単にテーブル構造が変えられるのは非常に楽だと思います。
はじめは、テーブル構造の変遷を追いづらくなるのかな、と思いましたが、それはソース管理すれば良いだけの話なので、そこまで問題にはならないかと思います。
もう少し機能や使い方、運用ルールなどを考えていきます。
公式ドキュメント:https://github.com/winebarrel/ridgepole

naoki85
Web系のエンジニアです。 RubyやPHPを主に書いています。
https://scrapbox.io/naoki85/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away