🐣

【初学者向け】RailsにMySQLを接続する方法

2024/10/20に公開

はじめに

RailsとMySQLの接続に関する記事は既にいくつかありますが、最新の記事もあまり無かったので、とりあえず動かしたい!という初学者の方に向けて書こうと思いました。

前提

  • RubyとRailsがインストールされていること
  • Macの場合、HomeBrewがインストールされていること

今回の環境

  • Ruby:3.3.5
  • Rails:7.2.1
  • MySQL:8.0.39

MySQLとは?

MySQLとは、データベース管理システム(DBMS)の一種です。データは「テーブル」と呼ばれる表形式で保存され、SQL(Structured Query Language)という言語を使って、データの追加、更新、削除、検索などを簡単に操作できます。

1. MySQLのインストール

事前にMySQLがインストールされているか、確認します。

事前確認
$ mysql --version

command not found : mysqlと表示された場合、MySQLはインストールされていないので、次の手順でインストールを行います。

インストール
$ brew install mysql

インストール後、再度バージョンを確認します。

MySQLのバージョンを確認
$ mysql --version

mysql Ver 8.0.39 for macos14.4 on arm64 (Homebrew)のように、バージョン情報が表示されたら、インストール完了です。

HomebrewでインストールされたMySQLの情報を確認
$ brew info mysql

mysql: stable 9.0.1 (bottled) のように、バージョン情報やインストール先を確認できます。

補足

バージョンに関しては、基本的に安定版を使用しましょう。
https://dev.mysql.com/doc/relnotes/mysql/8.0/en/
https://formulae.brew.sh/formula/mysql

2. MySQLの起動・停止

インストールが完了したら、MySQLのサーバーを起動します。

MySQLのサーバー起動
$ mysql.server start

Starting MySQL SUCCESS!と表示されたら、サーバーは起動している状態です。

MySQLのサーバー停止
$ mysql.server stop

Shutting down MySQL SUCCESS!と表示されたら、サーバーは停止している状態です。

※次の手順を進める前に、サーバーが起動している状態にしてください。

3. MySQLのセキュリティ設定

MySQLの初期設定として、セキュリティ設定を行います。
設定中にいくつか確認が表示されますが、基本的には「y(yes)」を入力して進めてください。

セキュリティ設定の手順
$ mysql_secure_installation
   1. VALIDATE PASSWORDプラグインの設定
   2. rootユーザーのパスワード設定
   3. 匿名ユーザーの削除
   4. リモートからのrootログインを無効化
   5. testデータベースの削除
   6. 権限テーブルのリロード
セキュリティ設定の実行結果
mysql_secure_installation

Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

`# パスワード強度を確認するプラグインを有効にします。`
VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: y `「y」を入力`

`# パスワード強度を設定します。今回は1(MEDIUM)を選択しましたが、強固にしたい場合は2(STRONG)、簡易にしたい場合は0(LOW)を入力しましょう。`
There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1 `「1」を入力`

`# MySQL管理者(root)ユーザーのパスワードを設定します。`
Please set the password for root here.

New password: `# 新しいパスワードを入力`

Re-enter new password: `# 再度パスワードを入力して確認`

`# 設定したパスワードの強度が表示されます。問題がなければ続行します。`
Estimated strength of the password: 50
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y `「y」を入力`
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

`# 匿名ユーザーは不要なため、削除します。`
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y `「y」を入力`
Success.

Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

`# rootユーザーのリモート接続を無効化します。`
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y`「y」を入力`
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.

`# 不要なtestデータベースを削除します。`
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y `「y」を入力`
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

`# すべての変更を反映させるため、ユーザー権限情報をリロードします。`
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y `「y」を入力`
Success.

All done!

All done! と表示されたら、セキュリティ設定は完了です。

4. MySQLへ接続

次の手順で、MySQLに接続します。

MySQL接続
$ mysql -u root -p

実行後、パスワードを入力するよう求められるので、先ほど設定したrootユーザーのパスワードを入力します。

rootユーザーのパスワード入力
Enter password:

以下のように表示されたら接続完了です。

接続完了
mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.39 Homebrew

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

この状態で、MySQLの操作を行うことができます。

操作を終了する場合、以下を実行します。

接続の終了
mysql> exit
Bye

※次の手順を進める前に、MySQLに接続している状態にしてください。

5. MySQLのユーザー作成

MySQLの接続が完了したら、ユーザーを作成します。
プロジェクト名に合わせてユーザー名を設定すると、どのユーザーがどのプロジェクトに対応しているかがわかりやすくなり、管理がしやすくなります。
例:プロジェクト名が sample-projectの場合、ユーザー名をsample-userに設定します。

ユーザー作成
mysql> CREATE USER 'sample-user'@'localhost' IDENTIFIED BY 'password';

passwordの部分には、先ほど設定した パスワードポリシー(LOW、MEDIUM、STRONG)に従ったパスワードを入力してください。
以下のようなエラーが表示された場合、パスワードポリシーを満たしてないので、ポリシーを満たすパスワードを再度設定しましょう。

パスワードポリシーエラー
mysql> CREATE USER 'sample-user'@'localhost' IDENTIFIED BY 'password';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

パスワードポリシーに関しては、こちらの記事が参考になります。
https://dev.mysql.com/doc/refman/8.0/en/validate-password.html
https://qiita.com/keisukeYamagishi/items/d897e5c52fe9fd8d9273

以下が表示されたら、作成完了です。

ユーザー作成完了
Query OK, 0 rows affected

実際に作成されたユーザーを確認するため、一覧を表示します。
sample-userが含まれていれば、ユーザー作成が成功しています。

作成されているか確認
mysql> SELECT User, Host FROM mysql.user;
+------------------+-----------+
| User             | Host      |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
| sample-user      | localhost |
+------------------+-----------+
5 rows in set (0.01 sec)

ユーザーが作成できたら、次にそのユーザーに必要な権限を付与します。
権限を付与することで、作成したユーザーがデータベースにアクセスして操作(追加、削除、更新)ができるようになります。

権限の設定
mysql> GRANT ALL ON *.* TO 'sample-user'@'localhost';

以下が表示されたら、設定完了です。

権限の設定完了
Query OK, 0 rows affected (0.01 sec)

6. Railsアプリケーションの作成

Railsアプリを作成します。
新規でプロジェクトを作成する際、デフォルトでDB(データベース)がSQLiteに設定されているので、-d mysqlでDBをMySQLに設定します。

Railsアプリ作成
# どちらのコマンドを使用しても良いです
$ rails new アプリケーション名 -d mysql
$ rails new アプリケーション名 --database=mysql

今回はアプリケーション名をsample-appにしています。

作成ができたら、Gemfilemysql2が追加されていることを確認します。

Gemfileを確認
gem 'mysql2', '~> 0.5'

Gemfilemysql2が追加されていない場合は、手動で以下の行を追加してください。

Gemfileに追加
gem 'mysql2', '~> 0.5'

バージョン指定の~> 0.5は、安定したバージョンを使用するためです。

追加が完了したら、次のコマンドでmysql2をインストールします。

gemインストール
$ bundle install

7. RailsアプリケーションとMySQLの接続

Railsアプリが作成できたら、MySQLとの接続設定を行います。
usernamepasswordに先ほど作成したユーザー名とパスワードをconfig/database.ymlに直接記載できますが、パスワード等を公開するのは避けたいので、環境変数として管理します。
初期状態では、config/database.ymlファイルは以下のように設定されています。

config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  socket: /tmp/mysql.sock

development:
  <<: *default
  database: sample_app_development

test:
  <<: *default
  database: sample_app_test

production:
  <<: *default
  database: sample_app_production
  username: sample_app
  password: <%= ENV["SAMPLE_APP_DATABASE_PASSWORD"] %>

Railsで環境変数を使うために、dotenv-railsというgemをインストールします。Gemfileに次の行を追加してください。

Gemfileに追加
gem 'dotenv-rails'

Gemfileにgem 'dotenv-rails'を追加したら、インストールします。

gemインストール
$ bundle install

インストールができたら、プロジェクトのルートディレクトリに.envファイルを作成し、MySQLのユーザー名やパスワードなどの情報を環境変数として管理します。

.env
DATABASE_USER = 'sample-user' # MySQLで作成したユーザー名
DATABASE_PASSWORD = 'password' # ユーザーのパスワード
DATABASE_HOST = 'localhost' # ホスト名

.envファイルにはパスワードなどの機密情報が含まれるため、Gitに含めないようにする必要があるので、.gitignoreファイルに記載されていない場合、以下を追加します。

.gitignore
/.env*
!/.env*.erb

.envファイルに環境変数を用意できたら、config/database.ymlを以下のように変更します。

config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV['DATABASE_USER'] %> # 環境変数からユーザー名を取得
  password: <%= ENV['DATABASE_PASSWORD'] %> # 環境変数からパスワードを取得
  host: <%= ENV['DATABASE_HOST'] %> # 環境変数からホスト名を取得

development:
  <<: *default
  database: sample_app_development

test:
  <<: *default
  database: sample_app_test

production:
  <<: *default
  database: sample_app_production
  username: sample_app
  password: <%= ENV["SAMPLE_APP_DATABASE_PASSWORD"] %>

環境変数の設定が完了したら、DB(データベース)を作成します。

データベースの作成
$ rails db:create

SHOW DATABASESで作成されたデータベースを確認します。

データベースの確認
mysql> SHOW DATABASES;
+------------------------+
| Database               |
+------------------------+
| information_schema     |
| mysql                  |
| performance_schema     |
| sample_app_development |
| sample_app_test        |
| sys                    |
+------------------------+

sample_app_developmentsample_app_testが入っているのがわかります。

最後に、マイグレーションを実行して、データベースにテーブルを作成します。

テーブル作成
$ rails db:migrate

これで、RailsとMySQLの接続は完了です!🎉

参考記事

https://qiita.com/fuku_tech/items/a380ebb1fd156c14c25b
https://himakuro.com/rails-mysql-setup

Discussion