はじめに
Rails 6 に追加された新機能を試す第116段。 今回は、MySQL データベース存在チェック
編です。
Rails 6 では、MySQLのデータベースを存在するかどうかをチェックする方法が少し変わりました。
データベースが存在しないときに、 bin/rails db:migrate
を実行した場合、 MySQLのエラーメッセージが英語以外でも、 ActiveRecord::NoDatabaseError
が発生するようになりました。
Ruby 2.6.5, Rails 6.0.2.1, Rails 5.2.4.1 MySQL 8.0.16 で確認しました。 (Rails 6.0.0 でこの修正が入っています。)
$ rails --version
Rails 6.0.2.1
今回は、MySQL のエラーメッセージを ja_JP にして起動して、 bin/rails db:migrate
コマンドを使って Rails 6.0.2.1 と Rails 5.2.4.1 の違いを確認してみます。
今回、MySQL のエラーメッセージを日本語に切り変えるために mysqld コマンドに --lc_messages_dir=/usr/share/mysql-8.0 --lc_messages=ja_JP
オプションを追加しています。
MySQL 側で直接、データベースが存在しないことを確認する
mysql コマンドでデータベースが存在しないことを確認します。
ここで、メッセージの先頭が 1049 となっていることに注意してください。
$ mysql -u root app_development
ERROR 1049 (42000): 'app_development' は不明なデータベースです。
db:migrate を実行する
エラーを確認するために、 db:create
しないで db:migrate
を実行すると ActiveRecord::NoDatabaseError
が発生します。
$ bin/rails db:migrate
rails aborted!
ActiveRecord::NoDatabaseError: 'app_development' は不明なデータベースです。
/usr/local/bundle/gems/activerecord-6.0.2.1/lib/active_record/connection_adapters/mysql2_adapter.rb:28:in `rescue in mysql2_connection'
ちなみに MySQL のエラーメッセージが英語の場合も ActiveRecord::NoDatabaseError
となります。
$ bin/rails db:migrate
rails aborted!
ActiveRecord::NoDatabaseError: Unknown database 'app_development'
/usr/local/bundle/gems/activerecord-6.0.2.1/lib/active_record/connection_adapters/mysql2_adapter.rb:28:in `rescue in mysql2_connection'
Rails 5 では
MySQL のエラーメッセージが日本語の場合は、 Mysql2::Error
となります。 英語の場合は、 ActiveRecord::NoDatabaseError
になります。
日本語の場合:
$ bin/rails db:migrate
rails aborted!
Mysql2::Error: 'app_development' は不明なデータベースです。
/usr/local/bundle/gems/mysql2-0.5.2/lib/mysql2/client.rb:90:in `connect'
英語の場合
$ bin/rails db:migrate
rails aborted!
ActiveRecord::NoDatabaseError: Unknown database 'app_development'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/connection_adapters/mysql2_adapter.rb:26:in `rescue in mysql2_connection'
何が変わったのか
Rails 5 までは、 エラーメッセージに Unknown database
が含まれた場合に ActiveRecord::NoDatabaseError
を発生させていました。
Rails 6 では、 エラーメッセージではなく、エラーの番号が 1049 (最初に mysqlコマンドでデータベースが存在しないことを確認したときの値)であるときに、 ActiveRecord::NoDatabaseError
を発生させるようにしています。