【Ruby on Rails】マイグレーションが実行できない時に確認すべきこと

こんにちは、えびじゅんです。

 

Ruby on Railsではマイグレーションという機能を使うことで、SQLを書かずにテーブルを定義/変更することができます。

ですが、ローカル開発時に自分でデータベースをイジっていると、マイグレーションファイルが定義しているデータベースの状態と、ローカルのデータベースの状態が異なる状況になってしまい、マイグレーションコマンドが実行できなくなる場合があります。

本記事では、マイグレーションが通らなくなった場合の対処法についてご紹介します。

 


マイグレーションが通らない理由

大抵の場合、マイグレーションエラーが発生するときは

  • すでに存在しているテーブル/カラムをcreateしようとしている
  • 存在しないテーブル/カラムに変更を加えようとしている

のどちらかが多いかなと思います。

Git管理している場合に、ブランチを切り替えたときや他の人の修正を取り込んだときに起こりやすいです。

対処法1:DBを作り直す

一番簡単な方法はDBを作り直して、0からマイグレーションを実行することです。

 

注意点として、DB内のデータが全て消えてしまうので

  1. DBのダンプを取る
  2. rails db:migrate:resetで初期化する
  3. ダンプしていたデータをインポートする

という手順で基本的には元どおりです。

 

ただし、データがそのまま移行されるので、キー制約などは古いDBのままになってしまいます。

 

対処法2:強引にマイグレーションを通す方法

いちいちダンプとってインポートとかがめんどくさい場合は、強引にマイグレーションを通す方法もあります。

まず、rails db:migrate:statusでどこまでマイグレーションが実行されているのか確認します。

Status   Migration ID    Migration Name
--------------------------------------------------
   up     20190721164835  Create test
 down     20190721164912  Create views

実行すると、こんな風にマイグレーションのステータスが表示されます。

左端のStatusがupのものは実行済み、downのものは未実行のマイグレーションファイルになります。

 

このステータスをみながら、実行されていないファイルを確認し、エラーが出ている処理をコメントアウトすると強引ですが、マイグレーションを通すことはできます。

例えば、すでに存在しているテーブル/カラムを作成しようとしているというエラーだった場合、該当するマイグレーションファイルからcreate ~ の処理をコメントアウトしてしまえばOKです。

※当たり前ですが、DBの状態に変化はないので本番とローカルで状態が変わってしまうということだけ注意してください

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください