【初学者向け】RailsにMySQLを接続する方法
はじめに
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 --version
mysql Ver 8.0.39 for macos14.4 on arm64 (Homebrew)
のように、バージョン情報が表示されたら、インストール完了です。
$ brew info mysql
mysql: stable 9.0.1 (bottled)
のように、バージョン情報やインストール先を確認できます。
補足
バージョンに関しては、基本的に安定版を使用しましょう。
2. MySQLの起動・停止
インストールが完了したら、MySQLのサーバーを起動します。
$ mysql.server start
Starting MySQL SUCCESS!
と表示されたら、サーバーは起動している状態です。
$ 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 -u root -p
実行後、パスワードを入力するよう求められるので、先ほど設定した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
パスワードポリシーに関しては、こちらの記事が参考になります。
以下が表示されたら、作成完了です。
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 new アプリケーション名 -d mysql
$ rails new アプリケーション名 --database=mysql
今回はアプリケーション名をsample-app
にしています。
作成ができたら、Gemfile
にmysql2
が追加されていることを確認します。
gem 'mysql2', '~> 0.5'
Gemfile
にmysql2
が追加されていない場合は、手動で以下の行を追加してください。
gem 'mysql2', '~> 0.5'
バージョン指定の~> 0.5は、安定したバージョンを使用するためです。
追加が完了したら、次のコマンドでmysql2
をインストールします。
$ bundle install
7. RailsアプリケーションとMySQLの接続
Railsアプリが作成できたら、MySQLとの接続設定を行います。
username
とpassword
に先ほど作成したユーザー名とパスワードを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
に次の行を追加してください。
gem 'dotenv-rails'
Gemfileにgem 'dotenv-rails'
を追加したら、インストールします。
$ bundle install
インストールができたら、プロジェクトのルートディレクトリに.env
ファイルを作成し、MySQLのユーザー名やパスワードなどの情報を環境変数として管理します。
DATABASE_USER = 'sample-user' # MySQLで作成したユーザー名
DATABASE_PASSWORD = 'password' # ユーザーのパスワード
DATABASE_HOST = 'localhost' # ホスト名
.env
ファイルにはパスワードなどの機密情報が含まれるため、Gitに含めないようにする必要があるので、.gitignore
ファイルに記載されていない場合、以下を追加します。
/.env*
!/.env*.erb
.env
ファイルに環境変数を用意できたら、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_development
とsample_app_test
が入っているのがわかります。
最後に、マイグレーションを実行して、データベースにテーブルを作成します。
$ rails db:migrate
これで、RailsとMySQLの接続は完了です!🎉
参考記事
Discussion