Dockerで開発するRuby on Railsアプリで、マイグレーションファイルを作りマイグレーションを実行する方法。ユニークインデックスを追加する。

Dockerでマイグレーションファイルを作成し、マイグレーションを実行する方法です。

 

Railsのバージョンは7.0.4 / Ruby 3.2.0です
今回は、カラムにユニークインデックスを追加します。

 

まず最初にdockerデスクトップアプリを起動します。
その次にマイグレーションファイルを作成。

docker compose run web bundle exec rails g migration ファイル名

web の部分はdockerでアプリケーションをどういう名前にしているかによりますが僕の場合はwebです。

ファイル名は何をしているかが分かると良いので
docker compose run web bundle exec rails g migration add_unique_index_to_videos

というようにします。

これでひな形の


lass AddUniqueIndexToVideos < ActiveRecord::Migration[7.0]
  def change
  end
end

このようなファイルが作成されたと思うので、中に記述していきます。

今回はユニークインデックスをカラムに追加するので


add_index :テーブル名, :カラム名, unique: true

というようにします。

テーブル名は小文字で複数形、カラム名はそのままです。

全体では


lass AddUniqueIndexToVideos < ActiveRecord::Migration[7.0]
  def change
    add_index :テーブル名, :カラム名, unique: true
  end
end

このようになります。

そうしたら、マイグレーションコマンド


docker compose run web bundle exec rails db:migrate

でマイグレーションを行います。

 

ちなみにロールバックは


docker compose run web bundle exec rails db:rollback

これで出来るので、ロールバックしてみてデータベースのテーブルの設定が元の状態に戻るか確かめます。僕はHeidiSQLというアプリで接続して試すことが多いです。

1つずつバージョン番号を指定してロールバックしたい場合は


docker compose run web bundle exec rails db:migrate:status

コマンドでマイグレーションの状態を調べて、バージョン番号を確認します。


# 特定のマイグレーションを実行したい場合
docker compose run web bundle exec rails db:migrate:up VERSION=バージョン番号
# 特定のマイグレーションをロールバックしたい場合
docker compose run web bundle exec rails db:migrate:down VERSION=バージョン番号

テスト用にDBを同期したい場合は


docker compose exec spring bin/rails db:test:prepare

を実行します。(忘れやすいので注意)

これで大丈夫そうならOKです。

git add .
git commit -m "マイグレーションファイルの作成とマイグレーション実行"
git push origin main

のようにして、gitでpushしましょう。

また、render.comの場合はマイグレーションを実行環境のシェルで行う必要があるので
ブラウザの設定画面でシェルに接続して


rails db:migrate

と打つと、デプロイされた環境でマイグレーションが実行されます。

【おまけ】
ちなみにマイグレーションでnull: falseにした場合は
downにnull: trueを記述しないとロールバックで元に戻らないので、upとdownを明示してあげます。

(例)


class ChangeCollationOfVideosTitle < ActiveRecord::Migration[7.0]
  def up
    change_column :videos, :title, :string, collation: "utf8mb4_bin", null: false
  end

  def down
    change_column :videos, :title, :string, collation: "utf8_bin", null: true
  end
end

以上です。

何かの参考になれば幸いです。