ローカル開発のための PostgreSQL セットアップガイド
guide
このガイドでは、macOS上でDockerを使用してPostgreSQLをセットアップし、ローカル開発環境を 構築する方法を説明します。psql コマンドラインツールのインストールからデータベースの作成、 pressly/goose を用いたスキーママイグレーションの手順まで、実用的なステップを紹介しています。
モチベーション
昨今はデータベースをクラウド上に構築することが多いですが、アプリケーション開発の段階では、 なにかとローカルで動作確認を行いたいことはまだまだ多いですよね。そこで、ローカル開発用に PostgreSQL を用意してあれこれ疎通する方法をまとめておきたいと思います。
想定環境
以下のような構成について記載していきます。
- 実行環境: macOS Sonoma 14.0
- データベース: PostgreSQL 16
- マイグレーション: pressly/goose
手順
PostgreSQLコンテナの起動:
Docker HubからPostgreSQLのイメージを使用して、コンテナを起動します。
(ここでは、postgres
という名前のデータベースと mysecret
というパスワードを使用していますが、適宜変更 してください)
docker run --name pg_playground -e POSTGRES_PASSWORD=mysecret -e POSTGRES_DB=postgres -p 5432:5432 -d postgres
このコマンドは、pg_playground
という名前の PostgreSQLコンテナ をデタッチドモードで起動し、ホストの 5432ポート を コンテナの5432ポート にマッピングしています。
psql コマンドラインツールのインストール:
システムに psql
がインストールされていない場合は、PostgreSQLパッケージをインストールする必要があります。
以下の通り、Homebrewを使ってインストールできます。
brew install postgresql
ユーザ作成:
psql
コマンドラインツールを使用して PostgreSQL データベースに接続する際に、シェルのカレントユーザー名を使用して接続したいと思いますので、ユーザーを作成します。ユーザの作成には、createuser コマンドを使用します。
createuser -U postgres -h localhost -p 5432 -sdP "$USER"
作成するユーザーのパスワードを入力するように求められます。任意のパスワードを入力してください。 なお、指定しているオプションは以下の通りです。
-U postgres
: ユーザー名(デフォルトのスーパーユーザー)-h localhost
: ホスト名(この場合はローカルホスト)-p 5432
: ポート番号-s, --superuser
: スーパーユーザー権限を付与-d, --createdb
: データベースを作成する権限を付与-P, --pwprompt
: パスワードのプロンプトを強制
作業用データベースの作成:
POSTGRES_DB
の指定により、postgres
という名前のデータベースがすでに作成されていますが、作業ごとにデータベースを作成して、作業を行うことをおすすめします。
データベースの作成には、createdb コマンドを使用します。
createdb -h localhost -p 5432 mydb
PostgreSQLコンテナに接続:
psql
コマンドラインツールを使用して、Dockerコンテナで実行されている PostgreSQLデータベース に接続します。
パスワードの入力を求められますので、先ほど作成したユーザーのパスワードを入力してください。
psql -h localhost -p 5432 -d mydb -W
ここまでで、PosgreSQL コンテナ内部のデータベースに接続する準備が整ったので、あとはSQLをあれこれ操作して作業することができます。
(Optional) スキーマ マイグレーション:
個人的には、手元に goose のマイグレーションスクリプトがある状態で動作の検証を行うことが多いです。
pressly/goose のインストールについては、https://github.com/pressly/goose#install にて説明されていますが、 例えば Homebrew でインストールできます。
brew install goose
goose
のインストールが完了したら、以下のようにマイグレーションを適用することができます。
mysecret
の箇所は、ユーザ作成時に指定したパスワードに差し替えてください。
export GOOSE_DBSTRING="postgres://$USER:mysecret@localhost:5432/mydb?sslmode=disable"
export GOOSE_DRIVER="postgres"
goose status
goose up
goose
では、デフォルトではカレントディレクトリに配置されているマイグレーションスクリプトを
処理します。この挙動は -dir string
オプションで変更可能です。(例: goose -dir "$HOME/dbmigration" status
)
よくあるマイグレーションツールと同様に、up
や down
でスクリプトを適用/削除したり、
status
で現在の状態を確認したりすることができます。その他、詳細については pressly/goose を 確認してみてください。
goose up
: マイグレーションスクリプトを適用goose up-by-one
: マイグレーションスクリプトを1つだけ適用goose down
: マイグレーションスクリプトを削除goose redo
: 直近のマイグレーションスクリプトを削除してから、再度適用goose status
: 現在の状態を確認
(Optional) コンテナの停止と削除:
作業が終わって、コンテナを停止および削除する場合は、以下のコマンドを実行します。
docker stop pg_playground
docker rm pg_playground
おわり
comments powered by Disqus