Just do IT

思うは招く

Rails new したときに生成されるデフォルトのDB設定ファイルの意味

  • Railsでは、rails newをすると、デフォルトだと自動でconfig/database.ymlが作成される
    • rails new -dでDBを選ぶオプションになる
    • -dオプションがなければ、sqlite3の使用を前提としたdatabase.ymlが生成される
  • .ymlはYAML(ヤムル)と呼ばれる拡張子で、データを整理するためのフォーマット
    • Rubyのハッシュっぽい記述法

実際のファイル。

config/database.yml

# SQLite. Versions 3.8.0 and up are supported.
#   gem install sqlite3
#
#   Ensure the SQLite 3 gem is defined in your Gemfile
#   gem 'sqlite3'
#
default: &default
  adapter: sqlite3
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

development:
  <<: *default
  database: db/development.sqlite3

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: db/test.sqlite3

production:
  <<: *default
  database: db/production.sqlite3

YAMLの書式

  • 「キー: 値」で記述される
  • キーに対して複数の設定をする場合、キーを宣言した後にインデントして記述する
  • &文字列は変数
  • 定義した変数を引用するには<<: *default(変数)のように書く
    • この場合、&defaultで定義した設定を読み込んでいる

Railsには動作する環境が3つ用意されている。

  • 開発環境:開発時に使用
  • テスト環境:自動テスト実行時に使用
  • 本番環境:開発済みのRailsアプリを本番サーバ上で稼働する際に使用

動作環境を変える場合、rails sコマンドの際に-eオプションをつける。

例:本番環境rails s -e production

デフォルトの設定

default: &default
  adapter: sqlite3
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000
設定 内容
adapter DB接続に使用するgem
pool コネクションプーリングで使用するコネクションの上限数
timeout DBからの応答待ちの上限時間(ミリ秒)

コネクションプーリングとは、データベースの接続をアクセスの度ごとに一からやり直すのではなく、アプリ側で保持して使い回す仕組み。これによってサーバーへの負荷を減らすことができる。

<%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

これは、RAILS_MAX_THREADSという環境変数が指定されていたらその値を、そうでなければ5という意味。 RAILS_MAX_THREADSは、Railsで起動するWebサーバーであるPumaのスレッド数を表す。

スレッドとは、プログラムの処理の流れのこと。Railsが標準採用するWebサーバーのPumaは、複数のスレッド(マルチスレッド)で動く。大量のアクセスを効率的にさばける。

開発、テスト、本番環境の設定

development:
  <<: *default
  database: db/development.sqlite3

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: db/test.sqlite3

production:
  <<: *default
  database: db/production.sqlite3

<<: *defaultでデフォルトの設定を引き継いでいる。

設定 内容
database DB名