1. はじめに
Railsではデフォルトのデータベースにsqlite3を使用しています。
今回はRailsアプリケーションのデータベースでMySQLを使用する方法を紹介します。
2. 開発環境
- macOS Monterey:12.3.1
- Ruby:3.1.0
- Bundler:2.3.12
- Ruby on Rails:6.1.5
- MySQL:8.0.28
3. 手順
3-1. MySQLのインストールとセキュリティ設定
まずは、MySQLのインストールとセキュリティの設定を行います。
MySQLをHomebrewでインストールしてセキュリティ設定を行う | あまブログ
3-2. MySQLのユーザー作成
次にMySQLの開発用ユーザーを作成します。
rootユーザーでログインします。
$ mysql -u root -p
ユーザーの作成します。
mysql> CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
ユーザーが作成されたことを確認します。
mysql> SELECT User,Host FROM mysql.user;
+------------------+-----------+
| User | Host |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
| newuser | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)
権限の付与します。
mysql> GRANT ALL ON * . * TO 'newuser'@'localhost';
今回の場合は全てのデータベースへのフルアクセス権を付与していますが、本来はユースケースに合わせた適切な権限を付与します。
権限が付与されたことを確認します。
mysql> SHOW GRANTS FOR 'newuser'@'localhost';
3-3. Railsアプリケーションの作成
次に、使用するデータベースにMySQLを指定してRailsアプリケーションを作成します。
$ rails new <アプリ名> -d mysql
アプリの作成後にconfig/database.ymlを以下のように修正します。
省略
default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: <ユーザー名>
password: <ユーザーのパスワード>
socket: /tmp/mysql.sock
development:
<<: *default
database: アプリ名_development
省略
test:
<<: *default
database: アプリ名_test
省略
production:
<<: *default
database: アプリ名_production
username: アプリ名
password: <%= ENV['アプリ名_DATABASE_PASSWORD'] %>
3-4. dotenv-railsの導入
次に、データベースの認証情報を安全に管理するためにdotenv-railsを導入します。
【Rails/MySQL】dotenv-railsを使ってデータベースの認証情報を環境変数で管理する | あまブログ
なお、作成したアプリをローカル環境でしか使わないなどの場合は特に気にする必要はないので、この手順はとばしてokです。
3-5. データベースの作成
以下のコマンドを実行してデータベースを作成します。
$ rails db:create
rails db:createコマンドはデフォルトでdevelopmentとtestの2つのデータベースを作成します。
最後にMySQLにログインしてデータベースが作成されたことを確認します。
mysql> SHOW DATABASES;
+-----------------------+
| Database |
+-----------------------+
| information_schema |
| ***_development |
| ***_test |
| mysql |
| performance_schema |
| sys |
+-----------------------+
6 rows in set (0.06 sec)
以上で終了です。
【参考】