7
11

More than 3 years have passed since last update.

RailsでPostgreSQLに接続するまでに必要な知識

Last updated at Posted at 2020-05-03

概要

RailsのデータベースとしてPostgreSQLを使用しようと思ったのですがかなり沼にハマったので、自分が必要だと感じたものを残します。
主にコマンドの解説になっております。
Railsとの接続手順については詳しい記事があるので、そちらを参考にしてください。(参考の節にリンクがあります)
まともに学習したわけではないので、理解できていない部分もあります。
間違いがあればご指摘よろしくお願いします。

環境

macOS Catalina
Ruby : 2.7.1
Rails : 6.0.2.2
PostgreSQL : 12.2
Homebrew 2.2.14

PostgreSQLのインストール

PostgreSQLを起動した状態でRailsと接続する必要があるのでインストールをします。
ここではHomebrew経由の方法です。

$ brew install postgresql

$ postgres --version
postgres (PostgreSQL) 12.2

PATHの設定

# PostgreSQLのパス
export PATH=/usr/local/pgsql/bin:$PATH

# PostgreSQL設定(DBの置き場所)
export PGDATA='/usr/local/var/postgres'

注:パスは開発グループの文書を参考にしているが、正直な話、ちゃんと通っているのか必要なのかもわからない...

$  which postgres
/usr/local/bin/postgres

$  echo $PATH
/usr/local/pgsql/bin:

PostgreSQLの起動

起動方法を3つみつけたが、何か違うのかなどよく分かっていない...
①はrails serverなどと同じように起動したターミナルに入力ができなくなるが、②、③についてはそのまま入力ができる。

自分は起動状態が分かりやすいので①で起動している。

$ postgres #起動

$  pg_ctl status #確認(別タブ)
pg_ctl: server is running

Ctrl+C で終了

$  pg_ctl start #起動
server started

$  pg_ctl status #確認
pg_ctl: server is running

$  pg_ctl stop #終了
server stopped

$  brew services start postgresql #起動
==> Successfully started `postgresql` (label: homebrew.mxcl.postgresql)

$  pg_ctl status #確認
pg_ctl: server is running

$  brew services stop postgresql #終了
Stopping `postgresql`... (might take a while)
==> Successfully stopped `postgresql` (label: homebrew.mxcl.postgresql)

データベースの確認

PostgreSQLを起動した状態で次のコマンドから確認できる。
データベース名は省略可。

psql --list [データベース名]
psql -l [データベース名]
$ postgres #dbの起動

$ psql -l
                              List of databases
      Name      |   Owner   | Encoding | Collate | Ctype | Access privileges
----------------+-----------+----------+---------+-------+-------------------
 postgres       | wm        | UTF8     | C       | C     |
 template0      | wm        | UTF8     | C       | C     | =c/user          +
                |           |          |         |       | user=CTc/user
 template1      | wm        | UTF8     | C       | C     | =c/user          +
                |           |          |         |       | user=CTc/user

インストール後の状態ですでに3つのデータベースがあるが、必要なものなので削除しないように注意。

templateはデータベースを作成する際にプログラムが使用しているらしい。

postgresは削除すると次のように、データベース名省略でのコマンドが使えなくなったので、詳しくはわからないがこれも削除しない方がよさそう。(コマンドの初期値になっているのかな?)

$  psql --list
psql: error: could not connect to server: FATAL:  database "postgres" does not exist

データベースの作成と削除

PostgreSQLを起動した状態で次のコマンドからデータベースの作成と削除が可能。

$ createdb [データベース名] #dbの作成

$ dropdb [データベース名] #dbの削除

データベースへの接続

PostgreSQLを起動した状態で、次のコマンドで接続される。

$ psql [データベース名] #dbに接続

postgres=>\q #終了
psql (12.2)
Type "help" for help.

postgres=> 

「postgres=>」部分に続けてコマンド入力することで操作する。
スーパーユーザーだと「postgres=#」、それ以外だと「postgres=>」になる。

ロール(ユーザー)の確認

PostgreSQLではユーザーのことをロールというらしい。
PostgreSQLを起動した状態でデータベースに接続後、次のコマンドからロールの作成と削除が可能。

$ postgres=> \du
$ postgres #dbの起動

$  psql postgres #データベースに接続
psql (12.2)
Type "help" for help.

postgres=>\du

   Role name   |                List of roles Attributes                    | Member of
---------------+------------------------------------------------------------+-----------
 user          | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

ロール(ユーザー)の作成、削除

PostgreSQLを起動した状態でデータベースに接続後、次のコマンドからロールの作成と削除が可能。
コマンドの最後に「 ; 」が必要なので忘れないように注意。

postgres=> create role [ロール名]; #ロールの作成

postgres=> drop role [ロール名]; #ロールの削除
postgres=> create role new_user; #ロールの作成

postgres=> \du #ロールの確認

   Role name   |                List of roles Attributes                    | Member of
---------------+------------------------------------------------------------+-----------
 new_user      | Cannot login                                               | {}
 user          | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

これでロールは作成されるのだが、Attributesに「Cannot login」とあるように、これではユーザーとして登録されていない。

postgres=> select usename from pg_user; #ユーザーの確認
  usename
-----------
 wm
(1 rows)

そこで次のようにオプションを指定する。(指定できるオプションについてはこちら)

postgres=> create role new_user WITH LOGIN; #ログインできるロールの作成

postgres=> \du #ロールの確認

   Role name   |                List of roles Attributes                    | Member of
---------------+------------------------------------------------------------+-----------
 new_user      |                                                            | {}
 user          | Superuser, Create role, Create DB, Replication, Bypass RLS | {}


postgres=> select usename from pg_user; #ユーザーの確認
  usename
-----------
 wm
 divemates
(2 rows)

データベースのオーナーを変更

データベースとロールが作成されている状態で次のコマンドで変更可能。
オプションについて詳しくはこちら

postgres=> ALTER DATABASE [データベース名] OWNER TO [新しいオーナー名];

オーナーを指定してデータベースを作成

ロールが作成されている状態で次のコマンドで作成。

$  createdb [データベース名] -O [ロール名]

テーブルの確認

Railsなどでテーブルを作成後、次のコマンドで確認できる。

postgres=> SELECT * FROM [テーブル名];
$ postgres #dbの起動

$ psql mydb #テーブルを作成したデータベースに接続
psql (12.2)
Type "help" for help.

mydb=> SELECT * FROM users;
 id | name | email 
----+------+------
(0 rows)

参考

PostgreSQL 11.5文書
PostgreSQLのインストールからRailsでのDB変更まで

7
11
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
7
11