Docker Compose + PostgreSQL + Python 連携:簡単構築で始めるデータ連携

Docker Compose で簡単構築!PostgreSQL + Python 連携の決定版

近年、データ分析やWebアプリケーション開発において、PythonPostgreSQL の組み合わせは非常に強力です。そして、開発環境の構築を容易にする Docker Compose を活用することで、この連携がさらにスムーズになります。

この記事では、Docker Compose を利用して PostgreSQL データベースを立ち上げ、Python スクリプトから接続し、基本的な操作(データの書き込み・読み込み)を行うまでの手順を、初心者の方にも分かりやすく解説します。

1. 前提条件

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 接続を閉じました。")

コードの解説:

  1. 接続情報: PostgreSQL への接続に必要なホスト名、データベース名、ユーザー名、パスワード、ポート番号を定義します。Docker Compose で起動した場合、ホスト名は localhost でアクセスできます。
  2. 接続: psycopg2.connect() 関数を使用して PostgreSQL サーバーに接続します。
  3. カーソル: conn.cursor() でカーソルオブジェクトを作成します。カーソルを通じて SQL クエリを実行します。
  4. テーブル作成: cur.execute()CREATE TABLE 文を実行し、users テーブルを作成します。conn.commit() で変更を確定します。
  5. データ挿入: INSERT INTO 文を実行し、データをテーブルに挿入します。conn.commit() で変更を確定します。
  6. データ読み込み: SELECT 文を実行し、テーブルからデータを取得します。cur.fetchall() で取得したすべての行をリストとして取得します。
  7. 結果表示: 取得したデータをループで処理し、画面に出力します。
  8. エラーハンドリング: try...except psycopg2.Error as e: ブロックで PostgreSQL 関連のエラーを捕捉し、エラーメッセージを表示します。
  9. 接続クローズ: finally ブロックで、必ずカーソルと接続をクローズします。

3.2. Python スクリプトの実行

ターミナルを開き、docker-compose.yml ファイルと main.py ファイルが存在するディレクトリに移動して、以下のコマンドを実行します。

python main.py

スクリプトが正常に実行されると、テーブルの作成、データの挿入、データの読み込み結果がターミナルに表示されます。

4. まとめ

この記事では、Docker Compose を使用して PostgreSQL データベースを簡単に起動し、Python スクリプトから接続して基本的なデータベース操作を行う方法を解説しました。

Docker Compose を利用することで、PostgreSQL の環境構築が非常に簡単になり、Python アプリケーションとの連携もスムーズに行えます。この方法を活用することで、ローカルでの開発環境構築や、コンテナ化されたアプリケーションのテストなどが容易になります。

PythonPostgreSQL を組み合わせた開発に、ぜひ Docker Compose を活用してみてください。