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
以上です。
何かの参考になれば幸いです。