0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

rails db:migrate時のエラーの解決

Posted at

#エラーに陥った経緯
下記のマイグレーションファイルでスペルミスをしてしまい、悪いことにreferenceの部分でミスをしたのでめんどくさいことになりました(涙)。

マイグレーションファイル.rb
    add_column :posts, :lunch_text, :text
    add_column :posts, :lunch_image, :text
    add_column :posts, :lunch_address, :string
    add_column :posts, :lunch_link, :string

    add_reference :posts, :place, foreign_key: true
    add_reference :posts, :sub_place, foreign_key: true 
#最後の行でsubplaceと入力すべきところをsub_placeとして、指定するテーブル名のスペルをまちがえてしまう。

スペルを間違えたのでrails db:rollbackをし書き直し、rails db:migrateを行ったところエラーに陥る。

#エラー内容
rails db:migrateした際に下記のエラーが出る

Mysql2::Error: Duplicate column name 'lunch_text': ALTER TABLE `posts` ADD `lunch_text` text

postsテーブルにlunch_textというカラムが重複していると言われているのですが
rails db:statusで確認すると当該ファイルはdownになっている。
ここで、マイグレーションファイルがdownになっているのにDBに当該マイグレーションファイルが反映されているという矛盾した状態になってしまいました。

#SQLを使用し解決
矛盾した状態を解決するためSQLで直接重複しているとされているカラムを削除しました。
その際下記のコマンドでカラムを削除します

ALTER TABLE posts DROP COLUMN lunch_text, DROP COLUMN lunch_image , DROP COLUMN lunch_address, DROP COLUMN lunch_link;

外部キー削除も同じように

ALTER TABLE posts DROP COLUMN place_id, DROP COLUMN sub_place_id;

とすると
ERROR 1553 (HY000): Cannot drop index 'index_posts_on_place_id': needed in a foreign key constraint
というエラーが出ます。
これは外部キー制約がかかっているのでindexが削除できないといっています。
よって外部キー制約を先に削除してあげなければいけません。
外部キー制約名を下記のコマンドで確認します。

SHOW CREATE TABLE テーブル名;

CONSTRAINTの右側にあるのが外部キー制約名です。
この外部キー制約名を使い外部キー制約を削除してから、外部キーカラムを削除するとうまくいきます。

#rails db:migrateのエラー解決
SQLで重複しているカラムを削除し、マイグレーションファイルと実際のDBの矛盾がなくなったので
rails db:migrateがエラーをはかず実行されます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?