こんにちは。たなかです。最近はRuby on Railsで開発してたりしなかったりします。
Fat Free CRMっていう顧客管理gemを扱う機会があって、プロジェクト用にゴニョゴニョ修正していたところ、以下のエラーにぶつかりました。
もくじ
問題のエラー
ActiveRecord::StatementInvalid: Mysql2::Error: Table '〇〇.xxxs' doesn't exist: SHOW FULL FIELDS FROM `xxxs`
※ブログ用に一部変更しています。
『〇〇データベースのxxxsテーブルが無いよ』と言っている(ように見える)。
該当のエラーで調査するとほぼほぼ『migrationファイルのreferenceが悪さしている』という記事にぶつかります。
Railsのバージョンを5.1にするとreferenceのデータ型が変わるらしいです。
参考サイト:https://qiita.com/umeneri/items/b46c537661f612f7318b
しかしながら、上記を試してみても改善されません。
思い切ってmigrateディレクトリの中身を全部移動させてみても同じエラー。
こうなってくるとmigrationファイルのせいじゃないのか…?
rails db:dropも通らずにっちもさっちもいかない感じになってしまいました。
解決方法
sequel ProからDBのテーブルを全部削除してみる
DBのGUIツール『sequel Pro』。macでweb開発している方はみんな似たようなツール使っているかと思います。
こちらからテーブルを全部選択し、削除。
再びrails db:migrate:resetすることで成功しました!やったぜ!
なんでdb:dropじゃダメだった?
技術者に相談してみたところ、db:dropでのデータベース削除はつまるところ「migrateの逆をやっている」とのこと。
今回の私の場合は若干レアケースで、db:migrateが途中で中断され、中途半端にテーブルが構築されてしまった状態でした。
この状態でdb:dropでテーブルを削除しようとしても、中途半端に依存関係が構築され「そんなテーブルないよ」と怒られてしまうとのこと。
この「中途半端にテーブルが生成されている」状態に気がつければもっと早く解決できたのに!変なハマり方してしまってました。
まとめ
db:dropがうまく効かない時は、直接テーブルを消してみる
といっても本番環境でそんな大胆なことできないとかいうケースもありそうですけどね。
Fat Free CRM、八転び九起き目がんばります。
おわり。