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

[Rails]マイグレーション孤児

More than 1 year has passed since last update.

rails db:migraterails db:rollback ができなくなった人はこの記事が参考になるかも知れません。

初心者向けの記事です。玄人は回れ右。

マイグレーションの親が不在

rails db:migrate:status した時に、Status では up となっているが、そのマイグレーションを指示した親であるマイグレーションファイルが存在せず、NO FILE となってしまっている場合の対処方法です。ここではこの状態にあるマイグレーションを孤児に例えて話を進めます。

まず、以下のコマンドで孤児になっているマイグレーションの ID を確認します。

rails db:migrate:status

この後で必要になります。手で入力するのは面倒なのでクリップボードにコピーしておきましょう。

例えば、エディタで以下のようにして自分が必要とする ID で後見人のマイグレーションファイルを作り、編集します。

vi db/migrate/20190825213821_guardian.rb
class Guardian < ActiveRecord:Migration[5.2]
  def change
  end
end

クラス名に後ろにある Migration[5.2] の数字は自分の Rails のバージョンにしてください。rails -v です。

再び以下のコマンドを実行すると、`NO FILE` となっていたマイグレーションがさっき作成したマイグレーションファイルによって後見されているはずです。

rails db:migrate:status

そのマイグレーションの Status を down にすれば解決します。以下、VERSION の引数はさっき自分で作った後見人の ID です。

rails db:migrate:down VERSION=20190825213821

はい、おしまい。後見人のマイグレーションファイルは消しても構いません。

すでに同名のテーブルが作成されていた場合

rails db:migrate --trace してみると分かりますが、テーブルが already exists だと言ってエラーになっていると思います。この場合、上記の方法だけではまだ解決しません。既にあるテーブル名で新規に作り直したいのであれば、既存のテーブルを削除する必要があります。PostgreSQL を例にあげます。

以下のコマンドで接続するデータベースの名前を確認します。

psql -l

-d オプションで接続します。

psql -d database_name

接続されると PostgreSQL のインタラクティブ・ターミナルが起動します。ここで \d コマンドを実行し、データベース内のテーブルを確認します。Type の列を見ながら削除したい table を見つけます。

目的のテーブルを見つけたら、以下の SQL を発行して削除します。一番後ろのセミコロンを忘れないでください。忘れて Enter/return してまった場合でも続けて入力できるので、セミコロンを入力して再度 Enter/return します。

DROP TABLE table_name;

もう一度 \d でテーブルを確認すると、しっかり消えているはずです。\q でインタラクティブ・ターミナルを抜けましょう。

これで Rails は、マイグレーションファイルによって新たにテーブルを作成し変更することも、ロールバックすることも出来るようになったはずです。

あとがき

これらの方法をすでに紹介している記事はいくつかヒットしますが、あんまり多くはない気がしたので Qiita に書いといた方がいいかなぁと思った次第です。特に後半の「すでにテーブルが作成されていた場合」に関する解決策は Rails とそれほど強い関係にないので、テーブルの消し方を探さずに Rails と関連づけて検索していると遠回りになるかも知れないからです。

viola
投稿から1年以上経っている記事を参考する際は注意してください。場合によっては古すぎます。
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした