【Rails】マイグレーションファイルとテーブルの履歴が合わない時
※下記の内容に不備がありましたら、コメント頂けると幸いです。また、下記の内容をご使用頂ける場合は自己責任でお願いします。
【目次】
メリット
マイグレーションファイルがなくなってしまっている時の対処方法がわかる
背景
えーーーデータベース関係でやらかしました。
herokuのMySQLにマイグレーションしようとしたらエラーが発生。
logを確認すると、存在しないテーブルにカラムを追加しようとすんなって言ってる。
ローカル環境では上手くいってるのになんで・・・って感じです。
内容
原因
ローカル環境のマイグレーションファイルとテーブルを確認。
すると、一番最初に作ったテーブルのマイグレーションファイルがなくなってる。。。
でも、MySQLにはテーブルが存在している。。。
なんで・・・前にマイグレーションファイルを虐めたら痛い目を見たので、今回もまたボコボコにされるのかと思うと涙が出てきました。
ローカル環境の解決策
色々調べたら、解決策は見つかるものですね。
荒療治かもしれませんが、なんとか解決することができました。
ただし、以前作成したテーブルを今後編集する可能性がある場合は、この方法はしないほうが良さそうです。
- schema.rbを元にSQLクエリを発行する
- マイグレーションファイルを作成する
- 作成したマイグレーションファイルにschema.rbの内容をコピー
- 念の為にMySQLのテーブルを削除する
- マイグレーションする
- 必要ないマイグレーションファイルを削除する
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.既に存在しているテーブルを削除する
$ 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の違い - 男女比はカレーと福神漬けと同じくらい