Ruby on RailsでMySQLを使用する際に必要な作業手順

はじめに
RailsではデータベースとしてSQLite3をデフォルトで使用しますが、SQLite3ではなくMySQLを使用したかったので、RailsでMySQLを使用するために行った作業をメモしておきます。
環境と前提
- サーバOS: ubuntu server 14.04
- すでにRuby、Railsがインストール済である環境
- Ruby 2.2.0
- Rails 4.2.0
Rails用のMySQLユーザを作成
RailsがMySQLにアクセスできるように、Rails用のMySQLユーザを作成します。 そのためにまずは以下コマンドでMySQLにログインします。以下の場合はユーザ作成権限を持つrootでログインしています。なお、パスワードを聞かれるので、各自設定したパスワードを入力します。
ログイン後、以下コマンドでMySQLユーザを作成します。今回はRails用のMySQLユーザとしてユーザ名がrailsuser
、パスワードがmypassword
であるユーザを作成します。
そして作成したrailsuser
にデータベース作成やテーブル作成の権限を付与しておきます。
以上でユーザ作成は完了です。
ちなみに上記の場合は全てのデータベースとテーブルに対する全権限をrailsuser
に付与していますが、特定のデータベースや処理を限定して権限を付与することも可能です。詳しくは下記サイトが参考になると思います。
ユーザ権限の確認・追加 | Qiita
ERROR 1396 (HY000)が表示された場合の解決策
もしMySQLユーザを作成しようとした際に以下の様なエラーが表示された場合、
すでにrailsuser
という名前のユーザが作成済であることが原因である可能性が高いです。そこで、このような場合は以下のコマンドで作成済のMySQLユーザを確認し、必要ならば削除してからMySQLユーザを作成し直すといいと思います。
データベース設定ファイル修正
Rails用のMySQLユーザを作成完了後、今度は作成したユーザ情報をRailsのデータベース関連の設定ファイルに記述します。Railsではルートディレクトリ配下のconfig/database.yml
にRailsが使用するデータベースに関する設定を保持しています。ここには、MySQLに接続するためのユーザ名やパスワードの設定を含みます。今回は本番環境のMySQLにRails用のMySQLユーザとしてユーザ名がrailsuser
、パスワードがmypassword
であるユーザを作成したのでこの情報をconfig/database.yml
に記述します。以下のようになります。
上記のようにconfig/database.yml
ではdevelopment
、test
、production
環境毎にデータベースの設定を記述することができます。また、config/database.yml
の中のdatabase:
の後に続く値がRailsが各環境毎に使用するデータベース名となります。
以上でRailsのデータベース設定ファイルの修正は完了です。
Railsが使用するデータベース、テーブルを作成
続いてRailsが使用するデータベース、テーブルをrake
コマンドを使用して作成しておきます。まずは下記コマンドでデータベースを作成します。
上記コマンドを実行すれば、config/database.yml
で記述したdatabase:
の後に続く値を名前として持つデータベースが作成されます。具体的には、
development
環境用にRails_development
という名前のデータベースtest
環境用にRails_test
という名前のデータベースproduction
環境用にRails_production
という名前のデータベース
RAILS_ENV=
の後に環境を指定してrake
コマンドを実行すればOKです。
上記でRAILS_ENV=production
のオプションを付けない場合はデフォルトではdevelopment
環境の指定になります。
データベースを作成したら後は下記コマンドでマイグレーションを実行し、テーブルを作成します。
データベースの場合と同様に以下のようにすれば環境を指定してマイグレーションを実行してテーブル作成可能です。
遭遇したエラーと解決策
Mysql2::Error: Access deniedが表示された場合
bundle exec rake db:create
やbundle exec rake db:migrate
を実行した時に以下のエラーが表示される場合があるかもしれません。
この場合は、表示の通りRailsからMySQLへのアクセスが拒否されているので、改めてconfig/database.yml
に記述した内容が合っているか、またRails用のMySQLユーザに適切な権限が付与されているかを確認すると手がかりがあるかもしれません。
なお、以下のコマンドでMySQLのユーザの権限を確認することができます。
上記のように表示されていれば、railsuser
には全ての権限が付与されていることになります。
また、同様のエラーとして以下のエラーが表示される場合があるかもしれませんが、こちらも権限付与が適切でない、もしくはconfig/database.yml
に記述されている内容がMySQL側と合致していない可能性が高いです。config/database.yml
をもう一度確認するといいかもしれません。
LoadError: cannot load such file -- readlineが表示された場合
bundle exec rake
関連のコマンドを実行した時に、以下のようなエラーが表示されました。
これはRails4以上から必要になっているrb-readline
というパッケージがインストールされていないことが原因のようです。ただ、詳しく調べることができなかったので間違っているかもしれません。
解決策としては、Gemfile
に以下を追記してbundle install
でOKです。
もしくは、以下のようにgem
コマンドでrb-readline
をインストールしてもOKです。
mysql2のインストール
RailsでMySQLをデータベースとして使用するために、以下をGemfile
に忘れずに追記してbundle install
し、mysql2
パッケージをインストールしておく必要があります。
以上でRailsでMySQLを使用するために必要な作業は完了です。
mysql2関連のエラー
上記のようにGemfile
にgem 'mysql2'
を追記してbundle install
を実行した際に下記のようなエラーに遭遇しました。
このエラーはMySQL関連のライブラリがインストールされていないことが原因なので、解決策としては以下のようにapt-get
で必要なパッケージをインストールすれば解決できます。
もし上記コマンドでlibmysqld-dev
をインストールしようとした時に今度は以下のようなエラーが出た場合は、
まずはlibmysqlclient18
というパッケージを削除し、その後でlibmysqlclient-dev
をインストールするとうまくいくかもれしれません。
具体的には、以下のコマンドを実行します。
Installation of libmysqlclient-dev fails if libmysqlclient18 is from percona | MySQL
おわりに
RailsでMySQLを使おうとしたら思いの外色々なエラーに遭遇したのでメモしておきました。
関連記事
- 公開日:2020/01/20 更新日:2020/01/20
MySQLでrootのパスワードを忘れたりログインできなくなった場合の対処方法
MySQLのrootのパスワードを忘れてしまいrootでログインできなくなってしまいましたが、rootのパスワードを再設定することができたのでその手順をまとめます。
- 公開日:2019/10/04 更新日:2019/10/04
RailsとSendGridでメール送信処理を実装する
Ruby on RailsからAction Mailerを使用してSendGrid経由でメールを送信する処理を実装したのでその手順をまとめます。
- 公開日:2019/09/09 更新日:2019/09/09
CSVファイルをMySQLにインポートするSQL文
CSVファイルをMySQLにインポートするSQL文をよく使うのでこのSQL文についてメモします。
- 公開日:2019/05/27 更新日:2019/05/27
Ubuntu18.04にMySQLをインストールする手順
UbuntuにMySQLサーバをインストールする機会が何かと多く、MySQL5.7以降で少々設定が変わっていたのでインストールと設定手順をまとめます。
- 公開日:2019/04/19 更新日:2019/04/19
MySQL Workbenchでエクスポート時にmysqldump Version Mismatchが出る場合の解決策
リモートサーバ上のMySQLデータベースの中身をちょっと確認したい時にMySQL Workbenchを使用しています。SSH経由での接続ももちろん可能で特に不満なく使えます。ただ、エクスポートする際に警告が表示されて解決に少しだけ時間かかってしまったので原因と解決手順をメモします。
開発アプリ
