Docker で PostgreSQL を使う: SQLAlchemy を使った基本的な接続と操作

2024-06-15

Docker コンテナ内から SQLAlchemy を使って PostgreSQL にアクセスする方法

このチュートリアルでは、Docker コンテナ内で実行されている PostgreSQL データベースに、SQLAlchemy を使って Python アプリケーションからアクセスする方法を説明します。

前提知識

このチュートリアルを理解するには、以下の知識が必要です。

  • Docker の基本的な概念
  • Python プログラミング
  • SQLAlchemy ORM

手順

  1. Docker Compose を使って PostgreSQL コンテナを起動する
docker-compose up -d

このコマンドは、docker-compose.yml ファイルに定義されているすべてのサービスを起動します。docker-compose.yml ファイルに PostgreSQL サービスが定義されていることを確認してください。

  1. SQLAlchemy で PostgreSQL データベースに接続する

PostgreSQL コンテナが起動したら、SQLAlchemy を使ってデータベースに接続できます。以下のコード例をご覧ください。

import sqlalchemy as sa

engine = sa.create_engine("postgresql://user:password@host:port/database")

# データベースとの接続を確立
with engine.connect() as connection:
    # データベース操作を実行
    connection.execute("SELECT * FROM mytable")

このコード例では、以下の変数を置き換える必要があります。

  • user: PostgreSQL ユーザー名
  • host: PostgreSQL コンテナのホスト名 (通常は localhost)
  • port: PostgreSQL コンテナのポート番号 (デフォルトは 5432)

補足

  • PostgreSQL コンテナのホスト名を取得するには、以下のコマンドを実行できます。
docker-compose ps -q postgres
  • コンテナ内の PostgreSQL データベースにアクセスするには、PostgreSQL コンテナのネットワークに接続する必要があります。docker-compose.yml ファイルでネットワークを定義することで、これを行うことができます。

    上記の手順は基本的な例です。実際のアプリケーションでは、より複雑な接続設定や操作が必要になる場合があります。




    docker-compose.yml ファイル

    version: "3.8"
    
    services:
      postgres:
        image: postgres:14.0
        restart: always
        environment:
          POSTGRES_PASSWORD: password
          POSTGRES_USER: postgres
        ports:
          - "5432:5432"
    

    このファイルは、postgres という名前の PostgreSQL コンテナを定義します。このコンテナは、postgres:14.0 イメージに基づいており、5432 ポートを公開します。

    app.py ファイル

    import sqlalchemy as sa
    
    # エンジンを作成
    engine = sa.create_engine("postgresql://postgres:password@localhost:5432/postgres")
    
    # データベースとの接続を確立
    with engine.connect() as connection:
        # テーブルを作成
        connection.execute("""
            CREATE TABLE IF NOT EXISTS users (
                id SERIAL PRIMARY KEY,
                name VARCHAR(255) NOT NULL,
                email VARCHAR(255) NOT NULL UNIQUE
            )
        """)
    
        # データを挿入
        connection.execute("""
            INSERT INTO users (name, email) VALUES ('John Doe', '[email protected]')
        """)
    
        # データを取得
        result = connection.execute("SELECT * FROM users")
        for row in result:
            print(row)
    

    このファイルは、users という名前のテーブルを作成し、データの挿入と取得を行う Python スクリプトです。

    実行方法

    以下のコマンドを実行して、Docker コンテナを起動します。

    docker-compose up -d
    

    次に、以下のコマンドを実行して、Python スクリプトを実行します。

    python app.py
    

    このコマンドを実行すると、以下の出力が表示されます。

    (1, 'John Doe', '[email protected]')
    

    この出力は、users テーブル内のデータを示しています。

    説明

    このサンプルコードは、以下のことを示しています。

    • create_engine() 関数を使って、PostgreSQL データベースへの接続を確立する方法
    • with ステートメントを使って、データベース接続を確実にクローズする方法
    • execute() 関数を使って、SQL クエリを実行する方法
    • fetchone() 関数を使って、単一の行のデータを取得する方法

    このサンプルコードは、Docker コンテナ内で実行されている PostgreSQL データベースにアクセスするための基本的な方法を示しています。実際のアプリケーションでは、より複雑なクエリや操作が必要になる場合があります。




    Docker コンテナ内 PostgreSQL に SQLAlchemy でアクセスするその他の方法

    環境変数を使う

    PostgreSQL コンテナの環境変数を使って、データベース接続情報などを設定できます。以下の例をご覧ください。

    version: "3.8"
    
    services:
      postgres:
        image: postgres:14.0
        restart: always
        environment:
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: password
          POSTGRES_DB: postgres
    

    上記の例では、以下の環境変数を設定しています。

    • POSTGRES_USER: PostgreSQL ユーザー名

    これらの環境変数は、以下のコードを使って Python スクリプトから参照できます。

    import os
    import sqlalchemy as sa
    
    # 環境変数から接続情報取得
    user = os.environ["POSTGRES_USER"]
    password = os.environ["POSTGRES_PASSWORD"]
    db_name = os.environ["POSTGRES_DB"]
    
    # エンジンを作成
    engine = sa.create_engine(f"postgresql://{user}:{password}@localhost:5432/{db_name}")
    
    # ... (後略)
    

    docker-compose.yml ファイルを使って、PostgreSQL コンテナとアプリケーションコンテナ間のネットワークを定義できます。これにより、アプリケーションコンテナから PostgreSQL コンテナのホスト名で直接アクセスできるようになります。以下の例をご覧ください。

    version: "3.8"
    
    services:
      postgres:
        image: postgres:14.0
        restart: always
    
      app:
        image: my-app-image
        depends_on:
          - postgres
        networks:
          - postgres-net
    
    networks:
      postgres-net:
    

    上記の例では、postgres-net という名前のネットワークを定義し、app コンテナをそのネットワークに接続しています。これにより、app コンテナは、postgres コンテナを postgres というホスト名で参照できます。

    psycopg2 を使う

    SQLAlchemy 以外にも、psycopg2 などのライブラリを使って PostgreSQL に接続できます。psycopg2 は、PostgreSQL とのネイティブな接続を提供するため、より高速で効率的な場合があります。

    SQLAlchemy Alembic は、データベースマイグレーションを管理するためのツールです。Alembic を使うと、データベーススキーマの変更を簡単に追跡し、データベースを安全にマイグレーションできます。

    Docker コンテナ内 PostgreSQL に SQLAlchemy でアクセスするには、さまざまな方法があります。それぞれの方法には、長所と短所があります。自分に最適な方法を選択してください。


      postgresql docker sqlalchemy


      PostgreSQL: システムカタログテーブルと情報スキーマビューを活用したテーブル主キー取得 - 詳細なコード例付き

      システムカタログテーブルを用いる方法PostgreSQLには、データベース内の様々な情報が格納されたシステムカタログテーブルと呼ばれるテーブル群が存在します。これらのテーブルを利用することで、PL/pgSQLからテーブルの主キーに関する情報にアクセスすることができます。...


      PostgreSQLの値を条件付きで増加させる - CASEステートメント、トリガー、ストアドプロシージャ

      UPDATEステートメントを使用して、特定のカラムの値を直接増やすことができます。例:usersテーブルのageカラムを1増やす+演算子を使用する例:productsテーブルのpriceカラムを100増やすINCREMENT関数は、UPDATEステートメントの中でカラムの値を1増やすために使用できます。...


      SQLAlchemy: Selecting with Textual Column Expressions - 詳細な解説

      このチュートリアルでは、SQLAlchemy でテキスト列式を使用してデータを取得する方法について解説します。テキスト列式は、データベースに保存されたテキストデータに対して演算や操作を行うための強力なツールです。前提条件このチュートリアルを理解するには、以下の知識が必要です。...


      【初心者向け】SQLalchemyでクエリ結果を自在に操る!first()メソッドの活用術

      概要SQLAlchemy の first() メソッドは、クエリ結果から最初の要素を取得するために使用されます。しかし、場合によっては意図した結果が得られないことがあります。 この記事では、first() メソッドを使用する際に発生する一般的な問題と、それらの解決策について詳しく説明します。...