Docker で PostgreSQL を使う: SQLAlchemy を使った基本的な接続と操作
Docker コンテナ内から SQLAlchemy を使って PostgreSQL にアクセスする方法
このチュートリアルでは、Docker コンテナ内で実行されている PostgreSQL データベースに、SQLAlchemy を使って Python アプリケーションからアクセスする方法を説明します。
前提知識
このチュートリアルを理解するには、以下の知識が必要です。
- Docker の基本的な概念
- Python プログラミング
- SQLAlchemy ORM
手順
- Docker Compose を使って PostgreSQL コンテナを起動する
docker-compose up -d
このコマンドは、docker-compose.yml
ファイルに定義されているすべてのサービスを起動します。docker-compose.yml
ファイルに PostgreSQL サービスが定義されていることを確認してください。
- 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