【Rails】Vagrant環境でPostgreSQLを使用する方法

# 開発環境
・Ruby: 2.5.7
・Rails: 5.2.4
・Vagrant: 2.2.7
・VirtualBox: 6.1
・PostgreSQL: 9.2.24
・OS: macOS Catalina

# 実装

## 1.`vagrant ssh`へログイン

```terminal:ターミナル
$ vagrant ssh
```

## 2.`yum`を最新版にアップデート

```terminal:ターミナル
$ sudo yum -y update
```

## 3.`PostgreSQL`をインストール

```terminal:ターミナル
$ sudo yum -y install postgresql
```

```terminal:ターミナル
$ sudo yum -y install postgresql-devel
```

```terminal:ターミナル
$ sudo yum -y install postgresql-server
```

`psql --version`を実行して、バージョンが表示されればインストール完了です。

```terminal:ターミナル
$ psql --version
psql (PostgreSQL) 9.2.24
```

## 4.`PostgreSQL`を初期化

```terminal:ターミナル
$ sudo postgresql-setup initdb
```

## 5.`PostgreSQL`を起動

```terminal:ターミナル
$ sudo service postgresql start
```

## 6.`PostgreSQL`のアカウントを作成し、ログインする

```terminal:ターミナル
$ sudo -u postgres psql
```

```terminal:ターミナル
postgres=# create role [任意のユーザー名] with createdb login password '[任意のパスワード]';
```

`\du`を実行してRoleが追加されていればアカウント作成完了です。

```terminal:ターミナル
postgres=# \du
                                    List of roles
  Role name      |                   Attributes                   | Member of 
-------------+------------------------------------------------+-----------
 [任意のユーザー名] | Create DB                                      | {}
 postgres        | Superuser, Create role, Create DB, Replication | {}
```

# 7.データベースを確認

手順4の`sudo postgresql-setup initdb`で作成されたデータベースを確認する。

```terminal:ターミナル
postgres=# \l
                             List of databases
   Name    |  Owner   | Encoding  | Collate | Ctype |   Access privileges   
-----------+----------+-----------+---------+-------+-----------------------
 postgres  | postgres | SQL_ASCII | C       | C     | 
 template0 | postgres | SQL_ASCII | C       | C     | =c/postgres          +
           |          |           |         |       | postgres=CTc/postgres
 template1 | postgres | SQL_ASCII | C       | C     | =c/postgres          +
           |          |           |         |       | postgres=CTc/postgres
(3 rows)
```

**※ template0とtemplate1の違いについては下記記事を参考にしてください。**

[PostgreSQLのtemplate0とtemplate1の違い](https://db.just4fun.biz/?PostgreSQL/template0%E3%81%A8template1%E3%81%AE%E9%81%95%E3%81%84%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)

## 8.Railsアプリを作成

デフォルトのデータベースがSQLiteなので、`-d`オプションでPostgreSQLを指定する。

```terminal:ターミナル
$ rails new sample -d postgresql
```

## 9.`database.yml`を編集

templateは、まっさらなデータベースを作成することが出来る`template0`を指定する。

```yml:config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  template: template0
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: 手順6で設定したユーザー名
  password: 手順6で設定したパスワード
```

## 10.データベースを作成

```terminal:ターミナル
$ rails db:create
```
####※ `FATAL: Ident authentication failed for user`というエラーが出る場合

**① PostgreSQLの設定ファイルを開く。**

```terminal:ターミナル
$ sudo vi /var/lib/pgsql/data/pg_hba.conf
```

**② 最下部にある認証方式を編集する。**

METHODを`md5`に変更してください。

```conf:pg_hba.conf
.
.
.
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
```

【よく使う認証方式】

`ident` : DBの所有者が、シェルを実行しているOSのユーザ名と一致するかで認証する、
`md5` : パスワードで認証する。
`trust` : 認証なし。

## よく使うコマンド

**【ログイン前】**

`sudo service postgresql start` : 起動
`sudo service postgresql stop` : 停止
`sudo service postgresql restart` : 再起動
`sudo -u postgres psql` : ログイン

**【ログイン後】**

`\q` : ログアウト
`\?` : ヘルプ表示
`\l` : データベース一覧表示
`\du` : ユーザー一覧表示
`\c データベース名` : データベースへ接続
`\z` : テーブル一覧表示