プログラミング

SQLAlchemyの条件式によるデータフィルタリング

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を使用してデータベースと接続し、クエリを実行する基本的なコードです。

python
from 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におけるANDOR句を模倣するものです。

python
from 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_()を使用することで、複数の条件のいずれかが一致するレコードを取得することができます。

python
from 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()を使用します。

python
from 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文を意識することなく、柔軟にデータを操作することができます。

Back to top button