すでにメンバーの場合は

無料会員登録

GitHubアカウントで登録 Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

登録がまだの方はこちらから

Pikawakaにログイン

GitHubアカウントでログイン Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

Ruby on Railsでデータベースを定義してみよう

この記事で出来るようになること

ActiveRecord

Pikawakaカリキュラムでは、Webアプリケーションのデータの保存先としてリレーショナルデータベースを利用します。

前回はSQLを使ってリレーショナルデータベースを操作する方法を学びましたね。

データベース言語

Ruby on Railsでは、標準で採用される「ActiveRecord」というO/Rマッピングを担うライブラリのおかげで、リレーショナルデータベースのレコードをオブジェクトとして直感的に扱えるようになります。

SQLではINSERT構文を使用して、テーブルに新しいレコードを挿入しましたが、RailsではActiveRecordのお陰で、オブジェクトを操作するようにデータ操作が可能になります。

SQLの場合
1
INSERT INTO users(name, age) VALUES('山田花子', 34);
Railsの場合
1
2
user = User.new(name: "山田花子", age: 34)
user.save

ActiveRecordについては、順を追って説明します。それでは、Ruby on Railsでデータベースの定義をしていきましょう。

データベース接続の設定

RailsからActiveRecord経由でリレーショナルデータベースに接続するには、まずconfigディレクトリ直下にあるdatabase.ymlに対して接続情報を設定する必要があります。

rails newコマンドでRailsアプリケーションを作成する際、自動的に生成されます。

database.yml

主な設定項目
1
2
3
4
5
adapter: #接続するデータベースの種類
encoding: #文字エンコーディング
database: #接続先のデータベース名
username: #データベースに接続するユーザー名
password: #データベースに接続するパスワード

database.ymlは、デフォルトではSQLiteというRDBMSを利用するための情報が設定されますが、今回はアプリケーション作成時に-d mysqlを付けたので、MariaDBを利用する設定で生成されます。

そのため、接続情報を手動で設定する必要はありません。

employee_managementアプリ作成時に実行したrails newコマンド
1
rails _6.1.3.1_ new employee_management -d mysql
rails _6.1.3.1_ new employee_management -d mysql の内容
  • Railsのバージョン「6.1.3.1」
  • アプリケーション名「employee_management」
  • データベース(RDBMS)「MariaDB」

-d mysqlとしていますが、カリキュラムでは互換性の高いMySQLのコマンドを利用してMariaDBに接続します。

今回はdatabase.ymlを編集しませんが、どんなことが書かれているのかをざっくりと把握しておきましょう。

ぴかわかさん

環境単位の設定

Railsには、「開発環境」「テスト環境」「本番環境」の3つの環境が用意されています。現在は開発環境でアプリケーションの開発を進めています。

Railsの3つの環境

  • 「開発環境」 - アプリケーション開発を行う作業場所
  • 「テスト環境」 - 作成した機能などをテストする場所
  • 「本番環境」 - 完成されたアプリケーションをユーザーが利用する場所

database.ymlでも環境単位で設定が分けられています。デフォルトで設定されるデータベースの名前は、アプリケーション名_環境名となります。

データベースも環境ごとに違う

ぴっかちゃん

環境ごとにデータベースを用意するようになっているんだね!

これによってデータを共有しなくて済むよ。たとえば本番環境のデータに影響を与えることなく、開発環境での作業を行うことができるよ

ぴかわかさん

共通部分の設定

各環境で共通する部分は、default: &default ~に設定されます。

この共通部分は&defaultによって、「default」という名前が付けられています。環境単位の設定箇所では、*defaultで呼び出して利用することができます。

database.ymlの内容

ぴっかちゃん

つまり、*defaultは、共通部分の設定を参照することができるんだね

railsコマンドでデータベースを作成する際には、database.ymlの内容に従って作成されるよ

ぴかわかさん
ポイント
  1. database.ymlは、データベースへの接続情報を設定するファイルである
  2. rails newコマンドによって自動的に生成される。デフォルトでは、SQLiteを利用するための情報が設定される。
  3. 次で説明するrails db:createコマンドを実行すると、database.ymlの内容に従ってデータベースが作成される

タイムゾーンの設定

多くの場合、サーバーには世界の時刻の標準であるUTC(協定世界時)が設定されます。

グローバルなアプリケーションを開発・運用する場合であれば、タイムゾーンはUTCで統一させますが、日本国内であれば、UTCに9時間を足したJST(日本標準時)が用いられます。

この章では、Railsのタイムゾーン、OSのタイムゾーンをUTCからJSTに変更します。

Railsのタイムゾーンを設定しよう

Railsのタイムゾーンの設定は、config/application.rbで行います。

タイムゾーンを設定

config/application.rbを開いて、デフォルトのタイムゾーンを設定しましょう

config.time_zoneでは、アプリケーションやActive Recordで使用するデフォルトのタイムゾーンを設定することができます。以下のようにapplication.rbの19行目のコメントを外し、タイムゾーンを東京に設定しましょう。

config/application.rb | タイムゾーンを東京に設定する
1
config.time_zone = "Tokyo"

タイムゾーンを東京に設定する

データベースの処理の際に使うタイムゾーンを設定しましょう

以下のようにapplication.rbの20行目にタイムゾーンを設定しましょう。

config/application.rb | データベースの処理の際に使うタイムゾーンをlocalに設定
1
config.active_record.default_timezone = :local

データベースの処理の際に使うタイムゾーンをlocalに設定

OSのタイムゾーンを設定しよう

Cloud9の環境に設定されるタイムゾーンを確認しましょう

以下のコマンドを実行して、Cloud9の環境に設定されるタイムゾーンがUTCであることを確認しましょう。

ターミナル | Cloud9の環境に設定されるタイムゾーンを確認
1
date

Cloud9の環境に設定されるタイムゾーンを確認

Cloud9の環境に設定されるタイムゾーンをJSTに変更しましょう

以下のコマンドを上から順番に実行して、タイムゾーンをJSTに変更しましょう。

※ コマンドは、タイプミスを減らすためにコピー&ペーストしてください。現時点でsedlnコマンドを理解する必要はありません。

ターミナル | 設定ファイルをUTCからAsia/Tokyoに変更する
1
sudo sed -i -e "/^ZONE=/c\ZONE=Asia/Tokyo" /etc/sysconfig/clock
ターミナル | シンボリックリンクを作成する
1
sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
ターミナル | Cloud9を再起動する
1
sudo reboot

最後のsudo rebootを実行すると、以下のようにCloud9が再起動されます。

Cloud9再起動

再起動後、以下のようにdateを実行して、Cloud9の環境に設定されるタイムゾーンがUTCではなく、JSTに変更されていることを確認しましょう。

JSTに変更

データベースの作成・削除

これまでに学習してきた内容では、phpMyAdminの画面上で操作したり、SQLを実行してデータベースの作成や削除をしてきましたね。

Railsでデータベースの作成や削除をするには、railsコマンドを利用します。

例 | データベースを作成する
1
rails db:create
例 | データベースを削除する
1
rails db:drop

上記のコマンドを実行すると、database.ymlの設定に従ってデータベースの作成や削除が行われます。

ぴっかちゃん

このコマンドだけで、データベースの作成や削除ができるって便利だね!

雛形作成の章でDBは作成済みだけど、コマンド操作に慣れるためにDBを削除して、もう一度作成をしてみよう

ぴかわかさん

データベースを削除してみよう

Webアプリケーションの雛形作成の章では、以下のようにrails db:createコマンドを実行して、「開発環境」と「テスト環境」のデータベースを作成していましたね。

2つのデータベースを作成

phpMyAdminでも、以下のように2つのデータベースを確認することができます。

2つのデータベース

railsコマンドを利用してデータベースを削除してみましょう

以下のコマンドを実行して、rails db:createコマンドで作成した2つのデータベースを削除しましょう。

ターミナル | カレントディレクトリをemployee_managementに変更する
1
cd ~/environment/employee_management
ターミナル | employee_managementのディレクトリにいることを確認
1
pwd
ターミナル(~/environment/employee_management) | データベースを削除する
1
rails db:drop

rails db:dropを実行すると、以下のように2つのデータベースが削除されます。

データベース削除

phpMyAdminにアクセスして、データベースが削除されたことを確認しましょう

phpMyAdminにアクセスする前に、以下のコマンドを実行してサーバを起動しましょう。

ターミナル
1
cd ~/environment/employee_management/public/phpMyAdmin-5.1.1-all-languages
ターミナル(~/environment/employee_management/public/phpMyAdmin-5.1.1-all-languages)
1
php -S 127.0.0.1:8081

phpMyAdminアクセスすると、以下のように2つのデータベースが削除されたことを確認することができます。

データベース削除を確認する

次はrails db:createでデータベースを作成してみます。

ぴかわかさん

データベースを作成してみよう

rails db:createを実行すると、database.ymlの設定に従って「開発環境」と「テスト環境」のデータベースが作成されます。

データベースも環境ごとに違う

ぴっかちゃん

本番環境のデータベースは作成されないんだね。

本番環境のデータベースを作成するには、RAILS_ENV=productionをrails db:createに付けて実行する必要があるよ

ぴかわかさん
railsコマンドを利用してデータベースを作成してみましょう

以下のコマンドを実行して、開発環境とテスト環境のデータベースを作成しましょう。

ターミナル | カレントディレクトリをemployee_managementに変更する
1
cd ~/environment/employee_management
ターミナル | employee_managementのディレクトリにいることを確認
1
pwd
ターミナル(~/environment/employee_management) | データベースを作成する
1
rails db:create

rails db:createを実行すると、以下のように2つのデータベースが作成されます。

データベース作成

railsコマンドで作成された2つのデータベースは、database.ymlで設定された開発環境とテスト環境のデータベースです。

以下のようにdatabase.ymlで設定するデータベース名とrailsコマンドで作成するデータベース名は、一致していますね。

開発環境とテスト環境のデータベース

phpMyAdminでも、2つのデータベースが作成されたことを確認することができます。

2つのデータベース

このようにrailsコマンドを利用すると、ターミナル上で簡単にデータベースの作成や削除の操作を行うことができます。

ポイント
  1. データベースの作成は、rails db:createを実行する
  2. データベースの削除は、rails db:dropを実行する
  3. 上記ではdatabase.ymlの設定に従ってデータベース作成や削除をする

この記事のまとめ

  • データベース接続の設定は、 config/database.ymlで行う
  • データベースの作成や削除をするには、railsコマンドを利用する
  • railsコマンドを実行すると、database.ymlの設定に従って、データベースの作成や削除が行われる