Railsアプリにバリデーションを定義した後の、テストデータ登録の成功が目的の備忘録です。その為、バリデーションの定義、記述は終わっている状態です。
データ保存したいのに、Mysql2に接続できない
Docker環境下のRailsアプリで、app/modelsにバリデーションを定義し、動作チェックの為にMySQLにデータ登録を試みました。そうしたら.....
Mysql2::Error::ConnectionError at /Unknown MySQL server host 'db' (0)
MySQLに繋がってないよと怒られました。
全く同じエラーにハマっている方も居ましたが、解決策は載っていません。
記事に載っていたdocker-compose upを実践するも、dockerは正常に起動していました。
いずれにせよ、データが登録できていないので、次はデータベースのチェックを行いました。
①rails db:create
②rails db:migrate
しかし、ダメでした。
下記はrails db:create実行後にターミナルに出力されたエラー
Unknown MySQL server host 'db' (0)
Couldn't create 'myapp_development' database. Please check your configuration.
rails aborted!
Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (0)
/Users/athlaliel/test/qa-coin/bin/rails:9:in `<top (required)>'
/Users/athlaliel/test/qa-coin/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'
Tasks: TOP => db:create
(See full trace by running task with --trace)
この後も、色々試した結果、原因が分かりました。
Docker環境でアプリを作成しているのに、実際はローカル環境でひたすらコマンドを叩いていました。Docker上のコンテナでMySQLも管理されてる以上、見つかるわけがなかったです。
下記のコマンドを順に実行する事で無事にデータベースは作成され、更新も可能となりました。
①docker-compose exec web rails db:create
②docker-compose exec web rails db:migrate
バリデーションのデータ登録
データベースがDocker上に出来たので、テストデータを登録しバリデーションが機能しているか試します。rails consoleを起動し、テストデータを登録していきます。
バリデーションに記述する文言はここでは書きませんが、変数を定義して**<モデル名.create>と入力します。
このコマンドでデータ登録が成功すれば、SQLと同じ文言が表示され、データの保存まで行います。その為、別途<モデル名>.save**コマンドを入力する必要はありません。
もしエラーが起きたら、下記コマンドでチェックして原因の追求を行います。
pry(main)> <モデル名>.errors
※user.rbというmodelsファイルがあれば、user.errorsとターミナルに入力します。
Mysql2::Error::ConnectionErrorのようなエラーに遭遇したら、自分が今どの環境で作業しているかのチェックを行ってみると良いでしょう。
参考記事
Unknown MySQL server host 'db' (0)エラーが消えない
Active Record バリデーション