概要
RailsアプリケーションをHerokuにデプロイを行う矢先、HerokuにSQLiteに対応していない事に気づき、PostgreSQLに変更致しました。その手順を紹介させて頂きます。
手順
ステップ1: PostgreSQLをインストール
まずはじめに、PostgreSQLをシステムにインストールします。Macの場合、Homebrewを利用してインストールできます。
brew install postgresql
ステップ2: Gemfileを更新する
次に、RailsアプリケーションのGemfileを更新します。sqlite3
の代わりにpg
(PostgreSQL)のgemを使用します。
gem 'pg'
Gemfileを更新したら、以下のコマンドで新しいgemをインストールします。
bundle install
ステップ3: database.ymlを更新する
config/database.yml
ファイルを更新して、PostgreSQLデータベースを指すようにします。
以下に例を紹介させて頂きます。今回はアプリケーション名をmyappとさせて頂き、開発環境のデータベース名はmyapp_development、テスト環境のデータベース名はmyapp_testとします。
補足として、my_app_developmentやmy_app_testでも、Rubyの命名規則として問題ありません。
1つ目の設定
こちらは、ローカルでの開発とテストでは特定のデータベースユーザーとパスワードを使用し、本番環境(Heroku)ではDATABASE_URLを使用するシナリオを想定しています。
default: &default
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: <%= ENV['DATABASE_USERNAME'] %>
password: <%= ENV['DATABASE_PASSWORD'] %>
host: <%= ENV['DATABASE_HOST'] %>
development:
<<: *default
database: myapp_development
test:
<<: *default
database: myapp_test
production:
<<: *default
url: <%= ENV['DATABASE_URL'] %>
2つ目の設定
こちらは、全ての環境(ローカル開発、テスト、本番)で特定のデータベースユーザーとパスワードを使用し、本番環境(Heroku)では加えてDATABASE_URLを使用するシナリオを想定しています。
default: &default
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
development:
<<: *default
database: myapp_development
username: <%= ENV['DATABASE_USERNAME'] %>
password: <%= ENV['DATABASE_PASSWORD'] %>
host: <%= ENV['DATABASE_HOST'] %>
test:
<<: *default
database: myapp_test
username: <%= ENV['DATABASE_USERNAME'] %>
password: <%= ENV['DATABASE_PASSWORD'] %>
host: <%= ENV['DATABASE_HOST'] %>
production:
<<: *default
url: <%= ENV['DATABASE_URL'] %>
一般的には、Herokuを使った本番環境ではDATABASE_URLを使用し、それ以外の環境では独自のユーザー名とパスワードを使用する1つ目の設定が良いと思います。
しかし、どのような環境を持っているのかなど、どの設定が適切か場合によると思います。
ステップ4: データベースを作成する
新しい設定でデータベースを作成します。
rails db:create
ステップ5: マイグレーションを実行する
最後に、データベースのマイグレーションを実行します。
rails db:migrate
以上の手順で、RailsアプリケーションのデータベースをSQLiteからPostgreSQLに変更することができます。