大田区から発信するゆるゆる日記

主にITエンジニアに関する備忘録日記。たまに趣味も。何か不備があればコメント頂けると幸いです。Twitterアカウント https://twitter.com/ryuzan03

【Rails】マイグレーションファイルとテーブルの履歴が合わない時

※下記の内容に不備がありましたら、コメント頂けると幸いです。また、下記の内容をご使用頂ける場合は自己責任でお願いします。

【目次】

 

メリット

マイグレーションファイルがなくなってしまっている時の対処方法がわかる

 

背景

えーーーデータベース関係でやらかしました。

 

herokuのMySQLマイグレーションしようとしたらエラーが発生。

 

logを確認すると、存在しないテーブルにカラムを追加しようとすんなって言ってる。

 

ローカル環境では上手くいってるのになんで・・・って感じです。 

 

内容

原因

ローカル環境のマイグレーションファイルとテーブルを確認。

 

すると、一番最初に作ったテーブルのマイグレーションファイルがなくなってる。。。

でも、MySQLにはテーブルが存在している。。。

 

なんで・・・前にマイグレーションファイルを虐めたら痛い目を見たので、今回もまたボコボコにされるのかと思うと涙が出てきました。

 

ローカル環境の解決策

色々調べたら、解決策は見つかるものですね。

 

荒療治かもしれませんが、なんとか解決することができました。

ただし、以前作成したテーブルを今後編集する可能性がある場合は、この方法はしないほうが良さそうです。

 

  1. schema.rbを元にSQLクエリを発行する
  2. マイグレーションファイルを作成する
  3. 作成したマイグレーションファイルにschema.rbの内容をコピー
  4. 念の為にMySQLのテーブルを削除する
  5. マイグレーションする
  6. 必要ないマイグレーションファイルを削除する

 

1.schema.rbを元にSQLクエリを発行する
$ rails db:schema:load

migrateファイルの変更は考慮しないで、テーブルがデータベースに作成されます。

※「rails db:migrate」との違いは、こちらが参考になります

 

2.マイグレーションファイルを作成する
$ rails g migration create_tables

 何も記述がないマイグレーションファイルが作成されます。

 

3.作成したマイグレーションファイルにschema.rbの内容をコピー

 schema.rbの内容を2のマイグレーションファイルにコピペする。

 create_table以下の内容をコピペするように注意してください。

 

4.念の為にMySQLのテーブルを削除する
$ root -u mysql -p #ローカル環境からMySQLにログイン

> USE appname_development;
> DROP TABLES table_name, table_name, ...;

手動でテーブルを削除しました。

テーブルに外部キーの設定がなければ、次に行うマイグレーションで最初にテーブルが削除されるみたいです。

なので、ここでテーブルを削除する必要はなさそうです。

  

5.マイグレーションする
$ rails db:migrate

schema.rbの内容をコピペされたマイグレーションファイルを参照して、テーブルが作成されます。

 

6.必要ないマイグレーションファイルを削除する

先ほど作ったマイグレーションファイル以前のマイグレーションファイルは削除しても問題ありません。

 

herokuへの変更の反映

herokuにあるMySQLにも変更を反映させます。

 

  1. 既に存在しているテーブルを削除する
  2. デプロイする
  3. マイグレーションする

 

1.既に存在しているテーブルを削除する
$ mysql -h <ホスト> -u <ユーザー名> -p -D <データベース名> #herokuの情報を入力してください
Enter password: <パスワード>

> USE appname_development;
> DROP TABLES table_name, table_name, ...;

※herokuにあるデータベースへのログインは、こちらが参考になります。

 herokuにあるデータベースにアクセスし、テーブルを削除します。

 

2.デプロイする
$ git push heroku master

ローカル環境からherokuにデプロイします。

 

3.マイグレーションする
$ heroku run rails db:migrate

ローカル環境からherokuにマイグレーションする。

 

これで『heroku open』とか入力したら、アプリにアクセスできると思います。

 

今後に向けて

マイグレーションファイルは消さないようにしようと思いました。

消した記憶はないんですけどね・・・

 

なんでマイグレーションファイルがなかったのに、テーブルは作成されていたんでしょうか?

 

いつか調査したいです。 

 

参考サイト

本当に先人の方々には頭が上がりません。いつもありがとうございます。

rake db:migrateとrake db:schema:loadの違い - 男女比はカレーと福神漬けと同じくらい

Railsのマイグレーションファイルを既存のスキーマ、データベースを元に作成|DIGITAL SQUADブログ

HerokuのMySQLのバージョン確認 - Qiita