MacにHomebrewでPostgreSQLをインストールしてデータベースを作る

環境
OS : macOS Hight Sierra v10.13.2
Homebrew : 1.5.2

HomebrewでPostgreSQLをインストールして起動する

Homebrewを最新化してインストールする準備をする

# 異常がないか確認する
$ brew doctor
Your system is ready to brew.

# アップデートする
$ brew update
Updated 5 taps (homebrew/science, homebrew/core, homebrew/php, homebrew/versions, caskroom/cask).
==> New Formulae
amber                                    kallisto
<省略>

# バージョンを確認する
$ brew -v
Homebrew 1.5.2
Homebrew/homebrew-core (git revision 5c4df; last commit 2018-01-25)

HomebrewでPostgreSQLをインストールする

# どんなバージョンがあるか確認する
$ brew search postgresql
==> Searching local taps...
postgresql          postgresql@9.4      postgresql@9.5      postgresql@9.6
==> Searching taps on GitHub...
caskroom/cask/navicat-for-postgresql     caskroom/cask/photo-supreme-postgresql
==> Searching blacklisted, migrated and deleted formulae...

# 今回はv9.6をインストールする
$ brew install postgresql@9.6
<省略>
==> Caveats
If builds of PostgreSQL 9 are failing and you have version 8.x installed,
you may need to remove the previous version first. See:
  https://github.com/Homebrew/legacy-homebrew/issues/2510

To migrate existing data from a previous major version (pre-9.0) of PostgreSQL, see:
  https://www.postgresql.org/docs/9.6/static/upgrading.html

To migrate existing data from a previous minor version (9.0-9.5) of PostgreSQL, see:
  https://www.postgresql.org/docs/9.6/static/pgupgrade.html

  You will need your previous PostgreSQL installation from brew to perform `pg_upgrade`.
    Do not run `brew cleanup postgresql@9.6` until you have performed the migration.

This formula is keg-only, which means it was not symlinked into /usr/local,
because this is an alternate version of another formula.

If you need to have this software first in your PATH run:
  echo 'export PATH="/usr/local/opt/postgresql@9.6/bin:$PATH"' >> ~/.bash_profile

For compilers to find this software you may need to set:
    LDFLAGS:  -L/usr/local/opt/postgresql@9.6/lib
    CPPFLAGS: -I/usr/local/opt/postgresql@9.6/include


To have launchd start postgresql@9.6 now and restart at login:
  brew services start postgresql@9.6
Or, if you don't want/need a background service you can just run:
  pg_ctl -D /usr/local/var/postgresql@9.6 start
==> Summary
🍺  /usr/local/Cellar/postgresql@9.6/9.6.6: 3,273 files, 36.8MB

環境変数を設定する

# PATHを設定する
$ echo 'export PATH="/usr/local/opt/postgresql@9.6/bin:$PATH"' >> ~/.bash_profile
$ source .bash_profile
$ printenv PATH
/usr/local/bin:/Users/mana/.phpenv/shims:/Users/mana/.phpenv/bin:/usr/local/bin:/Users/mana/.phpenv/shims:/Users/mana/.phpenv/bin:/usr/local/opt/postgresql@9.6/bin:/usr/local/Cellar/ant/1.10.0/libexec/bin:/usr/local/bin:/usr/local/sbin:/Users/mana/.nodebrew/current/bin:/Users/mana/bin/Sencha/Cmd/6.0.2.14/..:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

# デフォルトのデータディレクトリの場所を設定する
$ echo 'export PGDATA="/usr/local/var/postgres"' >> ~/.bash_profile
$ source .bash_profile
$ printenv PGDATA
/usr/local/var/postgres

PostgreSQLのデータベースクラスタを作成する

$ pg_ctl initdb -o "-E utf8 -U postgres"
The files belonging to this database system will be owned by user "mana".
This user must also own the server process.

The database cluster will be initialized with locale "ja_JP.UTF-8".
initdb: could not find suitable text search configuration for locale "ja_JP.UTF-8"
The default text search configuration will be set to "simple".

Data page checksums are disabled.

creating directory /usr/local/var/postgres ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.

Success. You can now start the database server using:

    /usr/local/Cellar/postgresql@9.6/9.6.6/bin/pg_ctl -D /usr/local/var/postgres -l logfile start

概要
pg_ctl init[db] [-s] [-D datadir] [-o initdb-options]
説明
initまたはinitdbモードはPostgreSQLの新しいデータベースクラスタを作成します。 データベースクラスタとは、単一のサーバインスタンスで管理されるデータベースの集合です。 このモードはinitdbコマンドを呼び出します。 詳しくはinitdbを参照して下さい。
オプション
-D datadir
データベース設定ファイルのファイルシステム上の場所を指定します。 これが省略された場合、環境変数PGDATAが使われます。
-o initdb-options
initdbコマンドに直接渡すオプションを指定します。
このオプションは、確実にひとまとめとして渡すために、通常は単一引用符または二重引用符で囲まなければなりません。
pg_ctl

initdb — PostgreSQLのデータベースクラスタを新しく作成する
概要
initdb [option...] [ --pgdata | -D ] directory
オプション
-E encoding
テンプレートデータベースの符号化方式を選択します。
-U username
データベースのスーパーユーザのユーザ名を選択します。 initdbを実行している実効ユーザの名前がデフォルトです。 スーパーユーザの名前はあまり重要ではありませんが、慣習的に使われているpostgresを(オペレーティングシステムのユーザ名と異なっていても)使っても良いでしょう。
initdb

PostgreSQLサーバを起動してみてみる

$ pg_ctl status
pg_ctl: no server running

# 起動する
$ pg_ctl -D /usr/local/var/postgres -l logfile start
server starting

$ pg_ctl status
pg_ctl: server is running (PID: 68826)
/usr/local/Cellar/postgresql@9.6/9.6.6/bin/postgres "-D" "/usr/local/var/postgres"

# バージョンをみてみる
$ psql -V
psql (PostgreSQL) 9.6.6

# データベース一覧をみてみる
$ psql -l -U postgres
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 
 template0 | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(3 rows)

# ユーザ一覧をみてみる
$ psql -c 'select * from pg_user' -U postgres
 usename  | usesysid | usecreatedb | usesuper | userepl | usebypassrls |  passwd  | valuntil | useconfig 
----------+----------+-------------+----------+---------+--------------+----------+----------+-----------
 postgres |       10 | t           | t        | t       | t            | ******** |          | 
(1 row)

# ロール一覧をみてみる
$ psql -c 'select * from pg_roles' -U postgres
      rolname      | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolconnlimit | rolpassword | rolvaliduntil | rolbypassrls | rolconfig | oid  
-------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+-------------+---------------+--------------+-----------+------
 postgres          | t        | t          | t             | t           | t           | t              |           -1 | ********    |               | t            |           |   10
 pg_signal_backend | f        | t          | f             | f           | f           | f              |           -1 | ********    |               | f            |           | 4200
(2 rows)

psqlPostgreSQLの対話的ターミナル
概要
psql [option...] [dbname [username]]
オプション
-c command
psqlに対し、指定のコマンド文字列commandを実行するよう指示します。 このオプションは繰り返すことができ、また-fオプションと任意の順序で組み合わせることができます。 -cまたは-fが指定されると、psqlは標準入力からコマンドを読み取りません。 その代わりに、すべての-cオプションおよび-fオプションを順に処理した後、終了します。
-l
利用可能な全てのデータベースを一覧表示し、終了します。 この他の接続に関連しないオプションは無視されます。
-U username
デフォルトのユーザではなくusernameユーザとしてデータベースに接続します (当然、そうする権限を持っていなければなりません)。
-V
psqlのバージョンを表示し、終了します。
psql

pg_user
pg_userビューはデータベースユーザに関する情報へのアクセスを提供します。 これはパスワードフィールドを隠蔽したpg_shadowを公に読めるようにしたビューです。
50.81. pg_user

pg_roles
pg_rolesビューはデータベースのロールに関する情報を提供します。 これは単に一般に公開されているpg_authidのビューですが、パスワード列が空白になっています。
50.72. pg_roles

データベースを作ってつなげる

PostgreSQLのユーザを作成する

$ createuser -d -e -P mana -U postgres
Enter password for new role: 
Enter it again: 
CREATE ROLE mana PASSWORD 'md5a6747d5690695f2d69c556af98aca23b' NOSUPERUSER CREATEDB NOCREATEROLE INHERIT LOGIN;

# ユーザ一覧で確認する
$ psql -c 'select * from pg_user' -U postgres
 usename  | usesysid | usecreatedb | usesuper | userepl | usebypassrls |  passwd  | valuntil | useconfig 
----------+----------+-------------+----------+---------+--------------+----------+----------+-----------
 postgres |       10 | t           | t        | t       | t            | ******** |          | 
 mana     |    16384 | t           | f        | f       | f            | ******** |          | 
(2 rows)

# ロール一覧で確認する
$ psql -c 'select * from pg_roles' -U postgres
      rolname      | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolconnlimit | rolpassword | rolvaliduntil | rolbypassrls | rolconfig |  oid  
-------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+-------------+---------------+--------------+-----------+-------
 postgres          | t        | t          | t             | t           | t           | t              |           -1 | ********    |               | t            |           |    10
 pg_signal_backend | f        | t          | f             | f           | f           | f              |           -1 | ********    |               | f            |           |  4200
 mana              | f        | t          | f             | t           | t           | f              |           -1 | ********    |               | f            |           | 16384
(3 rows)

createuser — 新しいPostgreSQLのユーザアカウントを定義する
概要
createuser [connection-option...] [option...] [username]
オプション
username
作成するPostgreSQLユーザの名前を指定します。
-d
新しいユーザに対してデータベースの作成を許可します。
-D
新しいユーザに対してデータベースの作成を禁止します。 これはデフォルトです。
-e
createuserが生成しサーバに送信するコマンドを出力します。
-U username
接続に使用するユーザ名です(作成するユーザの名前ではありません)。
-P
このオプションが指定されると、createuserは新しいユーザのパスワードのプロンプトを表示します。 もしパスワード認証を使う予定がなければ、これは必要ありません。createuser

データベースを作成する

$ createdb -e -O mana first-db "はじめてのPsgreSQLのDB" -U postgres
CREATE DATABASE "first-db" OWNER mana;
COMMENT ON DATABASE "first-db" IS 'はじめてのPsgreSQLのDB';

# データベース一覧で確認する
$ psql -l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 first-db  | mana     | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 
 postgres  | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 
 template0 | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(4 rows)

createdb — 新しいPostgreSQLデータベースを作成する
概要
createdb [connection-option...] [option...] [dbname [description]]
オプション
dbname
作成するデータベースの名前を指定します。 この名前はクラスタ内の全てのPostgreSQLデータベースの中で一意でなければなりません。 デフォルトでは、現在のシステムユーザと同じ名前でデータベースを作成します。
description
新しく作成されるデータベースに関連付けるコメントを指定します。
-e
createdbが生成し、サーバに送信するコマンドをエコー表示します。
-O owner
新しいデータベースの所有者となるデータベースユーザを指定します。 (この名前は二重引用符で囲まれた識別子として処理され
createdb

データベースに繋いでみる

$ psql -U mana -d first-db
psql (9.6.6)
Type "help" for help.

# データベース一覧をみてみる
first-db=> \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 first-db  | mana     | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 
 postgres  | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 
 template0 | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(4 rows)

# ロール一覧をみてみる
first-db=> \du
                                   List of roles
 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 mana      | Create DB                                                  | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

# テーブル一覧をみてみる(まだ何もない)
first-db=> \d
No relations found.

# 終了してみる
first-db=> \q

psqlPostgreSQLの対話的ターミナル
概要
psql [option...] [dbname [username]]
オプション
-d dbname
接続するデータベースの名前を指定します。 コマンドラインでオプション以外の最初の引数としてdbnameを指定するのと同じ効力を持ちます。
-U username
デフォルトのユーザではなくusernameユーザとしてデータベースに接続します (当然、そうする権限を持っていなければなりません)。
psql

思い出の一枚

f:id:ponsuke_tarou:20180131231929j:plain