
Docker Compose で簡単構築!PostgreSQL + Python 連携の決定版
近年、データ分析やWebアプリケーション開発において、Python と PostgreSQL の組み合わせは非常に強力です。そして、開発環境の構築を容易にする Docker Compose を活用することで、この連携がさらにスムーズになります。
この記事では、Docker Compose を利用して PostgreSQL データベースを立ち上げ、Python スクリプトから接続し、基本的な操作(データの書き込み・読み込み)を行うまでの手順を、初心者の方にも分かりやすく解説します。
1. 前提条件
Docker Desktop (または Docker Engine + Docker Compose) がインストールされていること
- まだインストールしていない場合は、以下を参照してインストールしてください。
Python 3 がインストールされていること
psycopg2ライブラリがインストールされていること- PostgreSQL に Python から接続するために使用します。まだインストールしていない場合は、以下のコマンドでインストールしてください。
pip install psycopg2-binary
2. Docker Compose で PostgreSQL を起動する
まずは、Docker Compose を使って PostgreSQL のコンテナを起動します。
2.1. docker-compose.yml ファイルの作成
プロジェクトのルートディレクトリに docker-compose.yml という名前のファイルを作成し、以下の内容を記述します。
version: '3.8' services: db: image: postgres:15-alpine container_name: mydb ports: - "5432:5432" environment: POSTGRES_USER: myuser POSTGRES_PASSWORD: mypassword POSTGRES_DB: mydatabase volumes: - db_data:/var/lib/postgresql/data volumes: db_data:
各項目の説明:
version: '3.8': Docker Compose のバージョンを指定します。services:: 起動するコンテナの定義を記述します。db:: PostgreSQL コンテナのサービス名です。Python スクリプトからはこの名前とポート番号でアクセスできます。image: postgres:15-alpine: 使用する PostgreSQL の Docker イメージを指定します。ここでは、軽量な Alpine Linux ベースのバージョン 15 を使用しています。container_name: mydb: コンテナ名をmydbに設定します。ports:: ホストマシンのポートとコンテナのポートをマッピングします。5432:5432は、ホストマシンの 5432 ポートへのアクセスをコンテナの 5432 ポート(PostgreSQL のデフォルトポート)に転送します。environment:: PostgreSQL コンテナの環境変数を設定します。POSTGRES_USER: myuser: PostgreSQL のユーザー名をmyuserに設定します。POSTGRES_PASSWORD: mypassword: PostgreSQL のパスワードをmypasswordに設定します。POSTGRES_DB: mydatabase: 作成するデータベース名をmydatabaseに設定します。
volumes:: ホストマシンのボリュームとコンテナ内のディレクトリをマウントします。db_data:/var/lib/postgresql/data: ホストマシンのdb_dataボリュームをコンテナ内の PostgreSQL のデータディレクトリ/var/lib/postgresql/dataにマウントします。これにより、コンテナが停止してもデータが永続化されます。
volumes:: ホストマシンのボリュームを定義します。ここではdb_dataという名前のボリュームを定義しています。
2.2. PostgreSQL コンテナの起動
ターミナルを開き、docker-compose.yml ファイルが存在するディレクトリに移動して、以下のコマンドを実行します。
docker-compose up -d
docker-compose up:docker-compose.ymlファイルに基づいてコンテナを起動します。-d: バックグラウンドでコンテナを実行します。
しばらくすると、PostgreSQL のコンテナが起動し、ホストマシンの 5432 ポートで PostgreSQL サーバーにアクセスできるようになります。
2.3. コンテナの状態確認
以下のコマンドで、起動したコンテナの状態を確認できます。
docker ps
mydb という名前のコンテナが Up 状態になっていれば、正常に起動しています。
3. Python スクリプトから PostgreSQL に接続する
次に、Python スクリプトから起動した PostgreSQL データベースに接続し、簡単な操作を行います。
3.1. Python スクリプトの作成
プロジェクトのルートディレクトリに main.py などの名前の Python スクリプトを作成し、以下の内容を記述します。
import psycopg2 # PostgreSQL への接続情報 DB_HOST = "localhost" DB_NAME = "mydatabase" DB_USER = "myuser" DB_PASS = "mypassword" DB_PORT = "5432" try: # PostgreSQL への接続 conn = psycopg2.connect(host=DB_HOST, database=DB_NAME, user=DB_USER, password=DB_PASS, port=DB_PORT) cur = conn.cursor() # テーブルの作成 cur.execute("DROP TABLE IF EXISTS users;") cur.execute("CREATE TABLE users (id SERIAL PRIMARY KEY, name VARCHAR(50), email VARCHAR(100));") conn.commit() print("テーブル 'users' を作成しました。") # データの挿入 cur.execute("INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');") cur.execute("INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com');") conn.commit() print("データを挿入しました。") # データの読み込み cur.execute("SELECT id, name, email FROM users;") rows = cur.fetchall() print("users テーブルのデータ:") for row in rows: print(f"ID: {row[0]}, 名前: {row[1]}, メール: {row[2]}") except psycopg2.Error as e: print(f"PostgreSQL エラー: {e}") finally: # 接続のクローズ if conn: cur.close() conn.close() print("PostgreSQL 接続を閉じました。")
コードの解説:
- 接続情報: PostgreSQL への接続に必要なホスト名、データベース名、ユーザー名、パスワード、ポート番号を定義します。Docker Compose で起動した場合、ホスト名は
localhostでアクセスできます。 - 接続:
psycopg2.connect()関数を使用して PostgreSQL サーバーに接続します。 - カーソル:
conn.cursor()でカーソルオブジェクトを作成します。カーソルを通じて SQL クエリを実行します。 - テーブル作成:
cur.execute()でCREATE TABLE文を実行し、usersテーブルを作成します。conn.commit()で変更を確定します。 - データ挿入:
INSERT INTO文を実行し、データをテーブルに挿入します。conn.commit()で変更を確定します。 - データ読み込み:
SELECT文を実行し、テーブルからデータを取得します。cur.fetchall()で取得したすべての行をリストとして取得します。 - 結果表示: 取得したデータをループで処理し、画面に出力します。
- エラーハンドリング:
try...except psycopg2.Error as e:ブロックで PostgreSQL 関連のエラーを捕捉し、エラーメッセージを表示します。 - 接続クローズ:
finallyブロックで、必ずカーソルと接続をクローズします。
3.2. Python スクリプトの実行
ターミナルを開き、docker-compose.yml ファイルと main.py ファイルが存在するディレクトリに移動して、以下のコマンドを実行します。
python main.py
スクリプトが正常に実行されると、テーブルの作成、データの挿入、データの読み込み結果がターミナルに表示されます。
4. まとめ
この記事では、Docker Compose を使用して PostgreSQL データベースを簡単に起動し、Python スクリプトから接続して基本的なデータベース操作を行う方法を解説しました。
Docker Compose を利用することで、PostgreSQL の環境構築が非常に簡単になり、Python アプリケーションとの連携もスムーズに行えます。この方法を活用することで、ローカルでの開発環境構築や、コンテナ化されたアプリケーションのテストなどが容易になります。
Python と PostgreSQL を組み合わせた開発に、ぜひ Docker Compose を活用してみてください。