mkdir blog && cd $_

ITエンジニアの雑感

PostgreSQLをmacにHomebrewでインストールする手順

macにHomebrewでPostgreSQLをインストールした手順をメモしておく。

前提

環境は以下になる。

macOS Sequoia

$ sw_vers
ProductName:        macOS
ProductVersion:     15.2
BuildVersion:       24C101

Homebrew

$ brew --version 

Homebrew 4.4.15

事前確認

インストールが可能なバージョンを確認する。

$ brew search postgresql
==> Formulae
postgresql@11      postgresql@12      postgresql@13      postgresql@14      postgresql@15      postgresql@16      postgresql@17      qt-postgresql      postgrest

==> Casks
navicat-for-postgresql                                                                 posture-pal

If you meant "postgresql" specifically:
postgresql breaks existing databases on upgrade without human intervention.

See a more specific version to install with:
  brew formulae | grep postgresql@

手順

今回はバージョン17をインストールするので、@17をつけてコマンドを実行する。(brew install postgresql@17) ちなみに現時点(2025/1)でバージョンを省略するとバージョン14がインストールされる。

$ brew install postgresql@17
==> Downloading https://formulae.brew.sh/api/formula.jws.json
###################################################################################################################################################################### 100.0%
==> Downloading https://formulae.brew.sh/api/cask.jws.json
###################################################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/postgresql/17/manifests/17.2
###################################################################################################################################################################### 100.0%
==> Fetching dependencies for postgresql@17: krb5
==> Downloading https://ghcr.io/v2/homebrew/core/krb5/manifests/1.21.3
Already downloaded: /Users/******************/Library/Caches/Homebrew/downloads/c5793441ca90aa09420dddd84f19d4aaf86da4f0b3f60c84940d77b1cb4c6863--krb5-1.21.3.bottle_manifest.json
==> Fetching krb5
==> Downloading https://ghcr.io/v2/homebrew/core/krb5/blobs/sha256:75d0ce70b754c159e642f7e9afff27add08203423792f34c240a20ea014bfcec
###################################################################################################################################################################### 100.0%
==> Fetching postgresql@17
==> Downloading https://ghcr.io/v2/homebrew/core/postgresql/17/blobs/sha256:e0efcbfe6f8bcfa1c63820af7a076f9d8b91b3c609c2e0f5dbfbf8b4df2d29f0
###################################################################################################################################################################### 100.0%
==> Installing dependencies for postgresql@17: krb5
==> Installing postgresql@17 dependency: krb5
==> Downloading https://ghcr.io/v2/homebrew/core/krb5/manifests/1.21.3
Already downloaded: /Users/******************/Library/Caches/Homebrew/downloads/c5793441ca90aa09420dddd84f19d4aaf86da4f0b3f60c84940d77b1cb4c6863--krb5-1.21.3.bottle_manifest.json
==> Pouring krb5--1.21.3.arm64_sequoia.bottle.tar.gz
🍺  /opt/homebrew/Cellar/krb5/1.21.3: 163 files, 5.6MB
==> Installing postgresql@17
==> Pouring postgresql@17--17.2.arm64_sequoia.bottle.tar.gz
==> /opt/homebrew/Cellar/postgresql@17/17.2/bin/initdb --locale=C -E UTF-8 /opt/homebrew/var/postgresql@17
==> Caveats
This formula has created a default database cluster with:
  initdb --locale=C -E UTF-8 /opt/homebrew/var/postgresql@17

When uninstalling, some dead symlinks are left behind so you may want to run:
  brew cleanup --prune-prefix

postgresql@17 is keg-only, which means it was not symlinked into /opt/homebrew,
because this is an alternate version of another formula.

If you need to have postgresql@17 first in your PATH, run:
  echo 'export PATH="/opt/homebrew/opt/postgresql@17/bin:$PATH"' >> ~/.zshrc

For compilers to find postgresql@17 you may need to set:
  export LDFLAGS="-L/opt/homebrew/opt/postgresql@17/lib"
  export CPPFLAGS="-I/opt/homebrew/opt/postgresql@17/include"

To start postgresql@17 now and restart at login:
  brew services start postgresql@17
Or, if you don't want/need a background service you can just run:
  LC_ALL="C" /opt/homebrew/opt/postgresql@17/bin/postgres -D /opt/homebrew/var/postgresql@17
==> Summary
🍺  /opt/homebrew/Cellar/postgresql@17/17.2: 3,813 files, 71.4MB
==> Running `brew cleanup postgresql@17`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
==> Caveats
==> postgresql@17
This formula has created a default database cluster with:
  initdb --locale=C -E UTF-8 /opt/homebrew/var/postgresql@17

When uninstalling, some dead symlinks are left behind so you may want to run:
  brew cleanup --prune-prefix

postgresql@17 is keg-only, which means it was not symlinked into /opt/homebrew,
because this is an alternate version of another formula.

If you need to have postgresql@17 first in your PATH, run:
  echo 'export PATH="/opt/homebrew/opt/postgresql@17/bin:$PATH"' >> ~/.zshrc

For compilers to find postgresql@17 you may need to set:
  export LDFLAGS="-L/opt/homebrew/opt/postgresql@17/lib"
  export CPPFLAGS="-I/opt/homebrew/opt/postgresql@17/include"

To start postgresql@17 now and restart at login:
  brew services start postgresql@17
Or, if you don't want/need a background service you can just run:
  LC_ALL="C" /opt/homebrew/opt/postgresql@17/bin/postgres -D /opt/homebrew/var/postgresql@17

psqlコマンドのパスを通すため、zshrc に追記する。

$ echo 'export PATH="/opt/homebrew/opt/postgresql@17/bin:$PATH"' >> ~/.zshrc
$ source ~/.zshrc

確認

psqlコマンドのパスを確認

$ which psql
/opt/homebrew/opt/postgresql@17/bin/psql

PostgreSQLのバージョンを確認

$ psql --version
psql (PostgreSQL) 17.2 (Homebrew)

サービスの起動をする

brew services start で、postgresqlのサービスを起動する。

$ brew services start postgresql
Error: Formula `postgresql@14` is not installed.

バージョンを指定しないで実行すと、バージョン14を起動しようとしてしまいエラーになる。 brew install postgresql でインストールをすると、デフォルトでバージョン14がインストールされるのでその影響かもしれない。

バージョンを指定してサービスを実行する。

$ brew services start postgresql@17
==> Successfully started `postgresql@17` (label: homebrew.mxcl.postgresql@17)

データベースの確認

$ psql -l
                                                                           データベース一覧
   名前    |      所有者      | エンコーディング | ロケールプロバイダー | 照合順序 | Ctype(変換演算子) | ロケール | ICUルール: |             アクセス権限              
-----------+------------------+------------------+----------------------+----------+-------------------+----------+------------+---------------------------------------
 postgres  | ****************** | UTF8             | libc                 | C        | C                 |          |            | 
 template0 | ****************** | UTF8             | libc                 | C        | C                 |          |            | =c/******************                  +
           |                  |                  |                      |          |                   |          |            | ******************=CTc/******************
 template1 | ****************** | UTF8             | libc                 | C        | C                 |          |            | =c/******************                  +
           |                  |                  |                      |          |                   |          |            | ******************=CTc/******************
(3)

接続をする

  1. ホストを指定してサーバーに接続する(psql postgres での接続も可能)
  2. \l でデータベースの一覧を確認する。(psql -l と同じ内容になるはず)
  3. \q で抜ける
$ psql -h localhost -p 5432 -U ****************** -d postgres
psql (17.2 (Homebrew))
"help"でヘルプを表示します。

postgres=# 
postgres=# \l
                                                                           データベース一覧
   名前    |      所有者      | エンコーディング | ロケールプロバイダー | 照合順序 | Ctype(変換演算子) | ロケール | ICUルール: |             アクセス権限              
-----------+------------------+------------------+----------------------+----------+-------------------+----------+------------+---------------------------------------
 postgres  | ****************** | UTF8             | libc                 | C        | C                 |          |            | 
 template0 | ****************** | UTF8             | libc                 | C        | C                 |          |            | =c/******************                  +
           |                  |                  |                      |          |                   |          |            | ******************=CTc/******************
 template1 | ****************** | UTF8             | libc                 | C        | C                 |          |            | =c/******************                  +
           |                  |                  |                      |          |                   |          |            | ******************=CTc/******************
(3)

postgres=# \q

データベースを作成して、テーブルを作成する

  1. 接続をする
  2. CREATE DATABASEtestというデータベースを作成する
  3. testデータベースにdistributorsテーブルを作成する
$ psql postgres
psql (17.2 (Homebrew))
"help"でヘルプを表示します。

postgres=# CREATE DATABASE test;
CREATE DATABASE
postgres=# \l
                                                                           データベース一覧
   名前    |      所有者      | エンコーディング | ロケールプロバイダー | 照合順序 | Ctype(変換演算子) | ロケール | ICUルール: |             アクセス権限              
-----------+------------------+------------------+----------------------+----------+-------------------+----------+------------+---------------------------------------
 postgres  | ****************** | UTF8             | libc                 | C        | C                 |          |            | 
 template0 | ****************** | UTF8             | libc                 | C        | C                 |          |            | =c/******************                  +
           |                  |                  |                      |          |                   |          |            | ******************=CTc/******************
 template1 | ****************** | UTF8             | libc                 | C        | C                 |          |            | =c/******************                  +
           |                  |                  |                      |          |                   |          |            | ******************=CTc/******************
 test      | ****************** | UTF8             | libc                 | C        | C                 |          |            | 
(4)

postgres=# \c test
データベース"test"にユーザー"******************"として接続しました。
test=# CREATE TABLE distributors (
     did    integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
     name   varchar(40) NOT NULL CHECK (name <> '')
);
CREATE TABLE
test=# \dt
                   リレーション一覧
 スキーマ |     名前     |  タイプ  |      所有者      
----------+--------------+----------+------------------
 public   | distributors | テーブル | ******************
(1)

test=# SELECT * FROM distributors;
 did | name 
-----+------
(0)

test=# \q

参考:https://www.postgresql.jp/document/16/html/sql-createtable.html

サービスの停止をする

brew services stop で、postgresqlのサービスを起動する。

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