🦧

Rails7.13 サクッとSchemafileでマイグレーションを管理

2024/02/12に公開

はじめに

従来のマイグレーション方法は、「rails db:migrate」コマンドを実行するたびにファイルが生成され、管理が煩雑でした。しかし、「ridgepole」gemを使えば、ファイル管理から解放され、Schemafileでマイグレーションをシンプルに管理できます。

この記事では、「ridgepole」を使ってSchemafileでマイグレーションを管理する方法をサクッとご紹介します。

実行環境

  • M2 mac mini
  • Rails 7.1.3
  • Ruby 3.2.3
  • Mysql 8.0
  • Docker 25.0.2
  • vscodeエディタ

環境構築が済んでいない方はこちらを参考に環境構築を行なってください。
https://zenn.dev/kei1232/articles/0fac51829570c1

Ridgepole インストール

Gemfileに以下を追加する

Gemfile
# migration/db schema
gem 'ridgepole'

追加したGemをインストール

docker-compose exec web bundle install

Schemafile の作成

空のSchemafileを作成します。この中にSchema情報を書いていき管理していきます。

touch db/Schemafile

Schemafileを編集

Schemafileにusersテーブルの記述を行います。

Schemafile
options = "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=COMPRESSED"

create_table "users", force: :cascade, options: options do |t|
  t.string :user_name, null: false
  t.string :email
  t.datetime :created_at, null: false
  t.datetime :updated_at, null: false
  t.index [:email], name: "users_email_index"
end

ridgepole.rakeを作成

touch lib/tasks/ridgepole.rake

ridgepole.rakeを作成し、Schemafileのマイグレーションコマンドを管理します。

lib/tasks/ridgepole.rake
namespace :ridgepole do
    desc 'ridgepole apply schemafile on development'
    task :apply do
      sh "bundle exec ridgepole -c config/database.yml -E #{ENV["RAILS_ENV"]} " \
         "--apply --file db/Schemafile --allow-pk-change"
    end
end

Schemafileをマイグレーションする

作成した「rake」を使用し、マイグレーションコマンドを実行します。今回は「development」環境でマイグレーションを行います。

docker-compose exec web rake ridgepole:apply RAILS_ENV=development

「test」環境の場合は以下を実行し、マイグレーションを行います。

docker-compose exec web rake ridgepole:apply RAILS_ENV=test

Userモデルを作成

※ Userモデルを作成している必要あり。作成していない方は以下のコマンドで作成。

docker-compose exec web rails g model User --skip-migration

スキーマにデータを作成

DBのseedはraikeファイルで管理します。

touch lib/tasks/set_up_data.rake

rakeファイルの宣言方法

rake
namespace :ファイル名 do
  task :タスク名 => :environment do
  end
end

rakeファイルにseedの設定を行う

set_up_data.rake
namespace :set_up_data do
  task :user => :environment do
    5.times.each do |t|
      user =  User.create(
        user_name: "user#{t}",
        email: "user#{t}@example.com",
        created_at: Time.now,
        updated_at: Time.now,
      )
      # user.skip_confirmation!
      user.save!
    end
  end
end

コマンドを実行しDBにデータを流し込む

rake ファイル名:タスク名

rake set_up_data:user

TablePlusで確認

TablePlusは使いやすいため、インストールしていない方はこちらからダウンロードすることをお勧めします。

接続設定

+ボタンを選択し、Mysqlを選択。各mysqlを自画像のように設定。passwordはpasswordに設定。
各環境に合わせて「User」、「password」、「Database」を設定してください。

usersテーブルが作成されていることが確認できます。

終わり

以上で「ridgepole」を使ってSchemafileでマイグレーションを管理する方法となります。上記の設定後、Schemafileにテーブルを記述、マイグレーションコマンドを実行、を行うことでデータベースにマイグレーションを行うことが可能となります。ぜひ試してみてください。

Discussion