【Rails】DBをPostgreSQLに変更する手順

f:id:nkeke0:20210331103144p:plain

はじめに

Rails開発途中に、DBsqliteを使用していたけれど、PostgreSQLに変更したい!

このような時にPostgreSQLのインストールから、RailsPostgreSQLを使えるようにするまでを記載いたします。

 

 

PostgreSQLをインストール

 
 $ brew install postgresql

 //インストールが正常にできたか確認
 $ postgres --version
 postgres (PostgreSQL) 12.4
 

 

PostgreSQLセットアップ

PGDATA設定

.bash_profileファイルに PostgreSQLを追加

ターミナルで以下コマンドを入力して.bash_profileを開きます。

 
 $ vi .bash_profile
 

以下順番で.bash_profileに追記します。


 // 1.カーソルの位置で入力モードに切り替え
 i
 // 2. PostgreSQL 追加
 export PGDATA=/usr/local/var/postgres

 // 3.コマンドモードに切り替え
 esc

 // 4.保存して終了
 :wq
 

 

保存できたら、cat .bash_profileをターミナルで実行し、ファイルの中身を確認しましょう。

export PGDATA=/usr/local/var/postgresが記載されていることを確認し、以下コマンドでシェルの設定ファイルを反映させます。

 
 $ source ~/.bash_profile 
 

データベース接続ユーザを作成

 
 //MyAppという名前のユーザーを作成
 $ createuser MyApp
 
 //パスワードが必要な場合
 $ createuser MyApp -P
 

DB作成

-Oオプションで先ほど作成したユーザーをオーナーに指定します。

 
 $ createdb MyApp_dev -O MyApp
 

Posgreユーザー作成の際に、バージョンの互換性によるエラーがでた場合


 The data directory was initialized by PostgreSQL version 11, which is not compatible with this version 12.4.
 

現在のバージョン12.4だが、バージョン11にする必要があるよ、と言われてエラーになってます。

以下方法で対処しましょう。

 
 //バージョン11をインストール
 $ brew install --build-from-source postgresql@11

 //バージョン12.4を停止し、新しくインストールしたバージョン11を起動する。

 $ brew services stop postgresql@12 //12は停止
 $ brew services start postgresql@11 //11を起動
 

DBが正常に起動するか確認

・DB起動

 
 $ brew services start postgresql
 

・ユーザー情報を確認

 
 $ psql -c 'select * from pg_user' postgres
 

・DBの一覧を表示

作成したDBの名前やオーナー等を一覧で表示します。

 
 $ psql -l
 

*ユーザー、DBを削除する方法

不要なユーザー、DBがあれば以下コマンドで削除可能です。

 
$ dropuser ユーザ名 //ユーザー削除
$ dropdb DB名 //DB削除
 

・作成したユーザーへ権限付与

権限を付与するのに必要な、macのユーザー名を確認します。

 
 $ whoami
 例) taro // macのユーザー名
 

次にpsqlコマンドで作成済みのデータベースに接続し権限を付与します。

DBへの接続は次のようにして行います。

 
 $ psql -U taro(macのユーザー名) MyApp_dev
 
 $ psql -U kenta MyApp_test
  psql (13.2, server 11.11)
  Type "help" for help.

  //ユーザー一覧を表示
  MyApp_test =# \du
  List of roles
 Role name | Attributes | Member of
  -----------+------------------------------------------------------------+-----------
  MyApp | | {}
  macのユーザー名 | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 
  //MyAppにSuperuserの権限を付与
  MyApp_test =# ALTER ROLE "MyApp" WITH Superuser;
  //再度ユーザー一覧を表示しMyAppにSuperuserの権限が付与されたか確認
  ALTER ROLE
  RestockInventory=# \du
  List of roles
  Role name | Attributes | Member of
  -----------+------------------------------------------------------------+-----------
  MyApp | Superuser | {}
  macのユーザー名 | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

  RestockInventory=# \q //操作終了
 

 DBが正常に起動し、作成したユーザー、DB等の確認が終わったら起動しているDBを止めておきましょう。

 
 $ brew services stop postgresql
 

 

Railsの設定

ここからは先ほどセットアップを行なったPostgreSQLRailsに適用していきます。

Gemfileの変更

初期設定のsqliteコメントアウトgem 'pgを指定

/Gemfile
 
 # gem 'sqlite3', '~> 1.4'
 gem 'pg'
 

ターミナルにてbundle installを実行しましょう。

 
 $ bundle install
 

config/database.ymlを書き換え、作成したPostgreSQLを指定する

 config/database.yml
 
 default: &default
  # adapter: sqlite3
  adapter: postgresql #変更
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000
  encoding: utf8 #変更
  username: MyApp # 追加
  password: # 追加
  host: localhost # 追加

 development:
  <<: *default
  # database: db/development.sqlite3
  database: MyApp_dev #変更

 test:
  <<: *default
  database: MyApp_test #変更

 production:
  <<: *default
  password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %>
 

 DB動作確認

migrateをリセットし、seedデータを入れてDBの動作確認を行います。

 
 $ rails db:migrate:reset
 $ rails db:seed
 

テストデータを挿入できたら以下コマンドでデータベースの中身を確認して見ましょう。

 
 $ rails db
 psql (13.2, server 11.11)
 Type "help" for help.
 MyApp_development=# SELECT * FROM [モデルで作成されたテーブル名];
 

おわりに

以上で、RailsPostgreSQLの導入が完了しました!

少し長くなってしまいましたが、読んでいただきありがとうございます。

ただ最初からPostgreSQLを指定して開発環境を作成していた方が、おそらくというか確実に楽でしょう。。。

 

Ruby on Railsを学びたい方へ

【おすすめ Udemy】よくわかるRuby on Rails入門 オンライン講座

 

参考サイト

PostgreSQLのインストールからRailsでのDB変更まで - Qiita