SQLAlchemyは、Pythonにおけるデータベースツールキットであり、リレーショナルデータベースとのインタラクションを簡素化するために使用されます。その中でも、「データのフィルタリング」と「条件による選択」は、非常に重要な操作の一つです。このエッセイでは、SQLAlchemyを使用したデータの「トランザクション」や「選択」処理に関する基本的な概念に加えて、SQLAlchemyにおける「条件式(クエリ)」の利用方法を完全かつ包括的に解説します。
1. SQLAlchemyとは?
SQLAlchemyは、PythonのORM(Object-Relational Mapping)ライブラリであり、Pythonのオブジェクト指向のコードとリレーショナルデータベースの間でデータをやり取りすることを簡便にします。SQLAlchemyには、2つの主要なコンポーネントがあります。

-
ORM(Object Relational Mapper): Pythonオブジェクトとデータベーステーブルを関連付けることで、データベース操作をオブジェクト指向で行えるようにします。
-
SQL Expression Language: より低レベルで、SQL文をプログラム的に構築できるツールです。SQLAlchemyのORMとSQL Expression Languageは密接に関連しており、ユーザーはどちらか一方または両方を利用してデータベース操作を行います。
この記事では、主にSQLAlchemy ORMを使用して、条件式を用いたデータのフィルタリング方法に焦点を当てます。
2. SQLAlchemyの基本的なクエリの作成方法
まず、SQLAlchemyでデータを取得するためには、セッション(session
)を使用します。セッションは、データベースとのやり取りを管理する役割を持っています。
以下は、SQLAlchemyを使用してデータベースと接続し、クエリを実行する基本的なコードです。
pythonfrom sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from models import Base, User # models.py に定義されたクラス
# データベースエンジンの作成
engine = create_engine('sqlite:///example.db')
# セッションの作成
Session = sessionmaker(bind=engine)
session = Session()
# クエリ実行
users = session.query(User).all()
# 結果の表示
for user in users:
print(user.name)
このコードでは、SQLiteデータベースexample.db
に接続し、User
テーブルからすべてのユーザー情報を取得しています。
3. SQLAlchemyにおける条件式(WHERE句)の使用
SQLAlchemyでは、クエリに条件を追加するために、filter()
メソッドを使用します。このメソッドを用いることで、SQL文におけるWHERE
句と同様の操作を行うことができます。
3.1 基本的な条件式
例えば、ユーザーの名前が「田中」であるレコードを取得するには、以下のようにfilter()
を使います。
python# ユーザー名が「田中」であるユーザーを取得
users = session.query(User).filter(User.name == '田中').all()
for user in users:
print(user.name)
このコードは、User
テーブルのname
列が「田中」と一致するすべてのレコードを取得します。
3.2 複数条件を使ったフィルタリング
複数の条件を組み合わせるには、and_()
やor_()
を使用します。これらは、SQLにおけるAND
やOR
句を模倣するものです。
pythonfrom sqlalchemy import and_
# ユーザー名が「田中」で、年齢が30歳以上のユーザーを取得
users = session.query(User).filter(and_(User.name == '田中', User.age >= 30)).all()
for user in users:
print(user.name, user.age)
このクエリは、name
が「田中」で、かつage
が30歳以上のユーザーを取得します。
3.3 or_()
を使った条件式
or_()
を使用することで、複数の条件のいずれかが一致するレコードを取得することができます。
pythonfrom sqlalchemy import or_
# ユーザー名が「田中」または「鈴木」のユーザーを取得
users = session.query(User).filter(or_(User.name == '田中', User.name == '鈴木')).all()
for user in users:
print(user.name)
このクエリは、name
が「田中」または「鈴木」であるユーザーを取得します。
3.4 like
を使った部分一致検索
LIKE
句を使うことで、部分一致検索が可能です。たとえば、ユーザー名に「田」が含まれるユーザーを検索する場合、以下のように書きます。
python# ユーザー名に「田」が含まれるユーザーを取得
users = session.query(User).filter(User.name.like('%田%')).all()
for user in users:
print(user.name)
%田%
は、文字列の前後に任意の文字が含まれている場合に一致することを意味します。
4. 高度な条件式の利用方法
SQLAlchemyは、さらに高度な条件式を使うことができます。例えば、日付や数値の範囲に基づいてレコードを選択することができます。
4.1 範囲によるフィルタリング
数値や日付が特定の範囲にあるレコードを取得するには、between()
を使用します。
python# 年齢が20歳から30歳のユーザーを取得
users = session.query(User).filter(User.age.between(20, 30)).all()
for user in users:
print(user.name, user.age)
このクエリは、age
が20歳以上30歳以下のユーザーを取得します。
4.2 in_()
を使ったリスト内の値の一致検索
複数の値のいずれかに一致するレコードを取得するには、in_()
を使用します。
python# 年齢が20, 30, 40のユーザーを取得
users = session.query(User).filter(User.age.in_([20, 30, 40])).all()
for user in users:
print(user.name, user.age)
このクエリは、age
が20, 30, 40のいずれかに一致するユーザーを取得します。
5. 条件付きソート
SQLAlchemyでは、order_by()
を使用して、クエリ結果をソートすることができます。たとえば、年齢で昇順に並べるには、次のように書きます。
python# 年齢で昇順に並べてユーザーを取得
users = session.query(User).order_by(User.age).all()
for user in users:
print(user.name, user.age)
降順に並べる場合は、desc()
を使用します。
pythonfrom sqlalchemy import desc
# 年齢で降順に並べてユーザーを取得
users = session.query(User).order_by(desc(User.age)).all()
for user in users:
print(user.name, user.age)
6. まとめ
SQLAlchemyは強力なデータベース操作ツールであり、条件式を使ったデータのフィルタリングは、リレーショナルデータベースから必要な情報を効率的に取得するための基本的かつ重要な技術です。基本的なフィルタリングから複雑な条件式、範囲検索や部分一致検索に至るまで、SQLAlchemyを使えば、PythonからSQL文を意識することなく、柔軟にデータを操作することができます。