ActiveRecord::StatementInvalid: Mysql2::Error: Table ‘〇〇.xxxs’ doesn’t exist: SHOW FULL FIELDS FROM `xxxs`

rails-logo

こんにちは。たなかです。最近は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、八転び九起き目がんばります。

おわり。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です