最近のプログラミング言語はrbenvanyenvなど複数のバージョンを共存して使うためのツールが用意されてる事が多いですが、PostgreSQLなどのデータベース環境にはまだデファクトスタンダードのものがないようです。Dockerを使えばいいのかもしれませんが、MacOSでは非常に遅くできるだけ避けたいのでHomebrewでサードパーティのフォーミュラを使った方法を紹介します。

インストール方法

まず標準のpostgresqlを既にインストールしていたらアンインストールしましょう。

$ brew list | grep postgresql
postgresql
$ brew uninstall postgresql
...
$ brew list | grep postgresql
$ 

フォーミュラを追加して使いたいバージョンをインストールします

$ brew tap petere/postgresql
$ brew install petere/postgresql/postgresql@12
$ brew install petere/postgresql/postgresql@13

古いバージョンであればpetere/postgresql/postgresql@13ではなくpostgresql@13だけでもインストールできますが、最新版だった場合は同じバージョンがhomebrew/coreにも存在するため、そちらがインストールされてしまいます。

postgresql-common

複数の postgresql を扱う方法は色々あるようですが、postgresql-common を使います。

$ brew instal postgresql-commmon

postgresql-common が用意してくれてるラッパースクリプトのpg_createclusterを使いデータベースクラスターを作ります。

$ pg_createcluster 12 main

正常に作れていればpg_lsclustersで確認できます。

❯ pg_lsclusters
Ver Cluster Port Status Owner    Data directory                        Log file
12  main    5432 online ironsand /usr/local/var/lib/postgresql/12/main /usr/local/var/log/postgresql/postgresql-12-main.log

DBの操作は pg_ctlの代わりにpg_ctlcluster を使い行います。

pg_ctlcluster 12 main start

これで特定のバージョンの Postgresql の起動が行えました。

Symbol not found に対処

私の環境では上記の方法ではrails consoleを行った時に以下のようにエラーになってしまいました。

dyld: lazy symbol binding failed: Symbol not found: _PQresultMemorySize
  Referenced from: /Users/ironsand/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/pg-1.2.3/lib/pg_ext.bundle
  Expected in: /usr/lib/libpq.5.dylib

dyld: Symbol not found: _PQresultMemorySize
  Referenced from: /Users/ironsand/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/pg-1.2.3/lib/pg_ext.bundle
  Expected in: /usr/lib/libpq.5.dylib

gemの参照関係がおかしくなっているようなのでpgを再インストールして対処しましょう。

gem uninstall pg
gem install pg

参考