LoginSignup
6
5

More than 1 year has passed since last update.

【Rails】SQlite3から本番環境だけPostgreSQLに変更する方法をどこよりも優しく伝える!

Last updated at Posted at 2022-09-27

目的

Render.comというPaasを利用して本番環境にアップする際に、データベスはPostgreSQLが指定されていました。
RailsのデフォルトDBはSQlite3ですので、PostgreSQLに乗り換える必要があるということです。
本記事では、テストと開発環境はSQlite3のまま、本番環境だけPostgreSQLに変更する手順を記録します。

手順

Rails newで新しいアプリを作成する

今回は最終的にRender.comにデプロイするところまで説明しますので、Render_appというアプリを作成します。

ターミナルにて

$ rails new Render_app
...
$ cd Render_app

このタイミングでGitHubにレポジトリを作成しておきます。

環境

私が作成したプロジェクトのバージョンは以下です。

$ ruby -v
=> ruby 3.1.2p20

$ rails -v
=> Rails 7.0.4

PostgreSQLを使う準備

macにHomebrew経由でpostgreSQLをインストールする

Rubyを扱う方ならHomeburewはインストール済かと思いますが、一応インストール方法の参照元を置いておきます。
https://prog-8.com/docs/ruby-env

ターミナルにてpostgresqlの最新の安定版をダウンロードしましょう。

$ brew install postgresql
...

# 導入確認
$ psql --version
=> psql (PostgreSQL) 14.5 (Homebrew)

PostgreSQLの初期設定

PostgreSQLをインストールしたら、使用するための初期設定をします。

データベースの初期化

まずは、データベースを初期化します。

$ initdb /usr/local/var/postgres -E utf8

PostgreSQLの立ち上げ・停止

PostgreSQLの立ち上げ・停止は以下のコマンドでおこないます。

# 立ち上げ
$ brew services start postgresql
==> Successfully started `postgresql@14` (label: homebrew.mxcl.postgresql@14)

# 停止
$ brew services stop postgresql
==> Successfully stopped `postgresql@14` (label: homebrew.mxcl.postgresql@14)

ユーザー設定

PostgreSQLを立ち上げた状態でユーザー設定をしていきます。

$ createuser -s -P <ユーザー名>
Enter password for new role: <パスワードを設定>
Enter it again: <サイドパスワードを入力>

このとき、入力したパスワードは表示されないので気をつけましょう。

ユーザー設定が完了したらPostgreSQLを停止します。

RailsアプリにPostgreSQLを導入

下準備ができたら、RailsアプリにPostgreSQLを導入していきます。

Gemfileの編集

SQlite3のgemをdevelopmenttest環境に引っ越しさせます。

Gemfile
- # Use sqlite3 as the database for Active Record
- gem "sqlite3", "~> 1.4"

+ group :development, :test do
+   # Use sqlite3 as the database for Active Record
+   gem "sqlite3"
+   ()
+ end

このとき、バージョンの指定を削除して常に最新版を使用するようにしました。

次に、本番環境にPostgreSQLを使用するように指定します。

Gemfile
group :production do
  # Use PstgreSQL as the database for Active Record
  gem 'pg'
end

Gemファイルを編集したら

$ bundle install

します。

環境設定

使用するデータベースの設定を環境ごとに指定するために、環境設定をしていきます。

database.ymlを編集

データベースの設定はconfig/database.ymlファイルで指定します。
下記のように編集します。

before

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

after

config/database.yml
default: &default
  adapter: sqlite3
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

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

test:
  <<: *default
  database: db/test.sqlite

production:
  adapter: postgresql
  encoding: unicode
  pool:  <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  database: <任意のデータベース名>
  username: <任意のユーザー名>
  password: <%= ENV['DB_PASSWORD'] %> # .envで設定

環境変数を設定

上で設定したdatabase.ymlファイルはGitHubにアップされます。
このファイルの中に本番環境で使用するデータベースのアクセスパスワードを直接記入すると、不正アクセスが発生する可能性があります。
そこで、.envというファイルを作成し、大切な情報はそこに記入するようにします。
ymlファイルの最終行にあるRuby式<%= ENV['DB_PASSWORD'] %>は、.envファイルから値を引っ張ってくる指示をしています。

.envファイルを作成する手順を記します。

まずは、本番環境用にdotenv-railsというGemファイルをインストールします。

Gemfile
group :production do
  ()
  # 環境変数の設定
  gem 'dotenv-rails'
end
$ bundle install

プロジェクトフォルダ直下に.env.productionファイルを作成し、パスワードを記入します。

.env.production
DB_PASSWORD = '<任意のパスワード>'

この時点では本番環境用のデータベースを作成していないので、パスワードは発行されていません。
とりあえず.env.productionのファイルを作成するだけでOKです。

database.ymlにパスワードを直接書かないのは分かったけど、.env.productionが盗まれたら元も子もないのでは?」

その通りです。
そこで、.env.productionをGitHubにアップしないようにセッティングします。

プロジェクトフォルダ直下に.gitignoreファイルを作成します。
このファイルに記載されたファイルは、gitにcommitされません。
.gitignoreに次のように追記します。

.gitignore
()
.env.production

試しにGitHubにpushしてみます。
スクリーンショット 2022-09-25 10.09.24.png

確かに.env.productionがpushされていないことが分かります。
もしここに.gitignoreで指定したファイルがアップされていたら下記記事を参照にpushしなおしてみてください。

(僕は.gitignoreのファイル名が間違っていてpushされていたので、そのへんもチェックしてみてください。)

データベースをつくる

やっと準備が終わりました。
データベースを作っていきましょう。
ターミナルにて

$ bundle exec rails db:create

を実行し、下記のようなメッセージが出ればPostgreSQLでデータベースの作成完了です。

Created database 'db/development.sqlite3'
Created database 'db/test.sqlite'

え? 作成されたデータベース、SQlite3じゃん
と思われるかもしれませんが、現在いるのは開発環境ですので、これでOKです。

実際に本番環境でデータベースを動かす方法は、次の記事で紹介します。

まとめ

以上で、SQlite3から本番環境だけPostgreSQLに変更する方法を紹介しました。

下に紹介する様々な記事に感謝すると同時に、本記事が誰かの役に立つことを願っています。

参考記事

Ruby on Railsの新しいプロジェクトでSQLite3からPostgreSQLに変更する

MacにPostgreSQLを導入する方法&初期設定をおこなう

【Rails】環境変数(.env)を設定・取得する方法

Railsガイド#データベースを設定する

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5