FlaskのSQLAlchemyでフィルタリング検索!filter, filter_byの使い方完全ガイド
生徒
「Flaskで作ったアプリで、特定のユーザーだけ表示したいです。どうすればいいですか?」
先生
「そのときに使うのがfilterやfilter_byですよ。これはデータベースから必要な行を絞り込むための検索方法です。」
生徒
「えっと、検索…難しそう…。初心者でも使えますか?」
先生
「大丈夫!条件を指定するだけで、必要なデータを簡単に取り出せます。一緒にやり方を見てみましょう!」
1. filterとfilter_byって何?
FlaskでSQLAlchemyを使っていると、ユーザー一覧など「全部のデータ」ではなく、
「この条件に当てはまるデータだけ欲しい」という場面がよく出てきます。
そのときに使うのがfilter()とfilter_by()という“絞り込み(検索)”のための機能です。
イメージとしては、Excelのフィルタ機能で「名前が太郎の行だけ表示する」「年齢が20歳以上の人だけ表示する」ような感覚です。大量のデータの中から、必要なレコードだけを取り出すための入口になるメソッドだと思ってください。
filter_by()は、「カラム名=値」というシンプルな条件で検索するときに使います。
たとえば「nameカラムが太郎のユーザーだけ欲しい」といった、等しい条件の絞り込みに向いています。
# name が「太郎」のユーザーだけを取り出したい例
user_query = User.query.filter_by(name="太郎")
この段階ではまだ実行前の「検索準備」のような状態で、all()やfirst()と組み合わせて実際のデータを取り出します。このあたりの詳しい書き方は、次の「filter_byの基本的な使い方」で丁寧に見ていきます。
一方でfilter()は、>=や<といった演算子を使ったり、複数の条件を柔らかく組み合わせたりできる、少し自由度の高い書き方ができるメソッドです。
# 年齢が20歳以上のユーザーだけを絞り込むイメージ
users_query = User.query.filter(User.age >= 20)
filter()では、User.age >= 20のように「モデル名.カラム名」と比較演算子を使った条件式を書きます。少しSQLの書き方に近づきますが、その分、範囲での検索や柔軟なフィルタリングがしやすくなります。
まとめると、filter_by()は「カラム名と値を指定するだけの分かりやすい書き方」、filter()は「条件式を使って細かく絞り込める書き方」というイメージです。まずは読みやすいfilter_by()から慣れていき、必要になったらfilter()で一歩進んだ検索に挑戦していくと理解しやすくなります。
2. filter_byの基本的な使い方
たとえば、Userモデルで「nameが太郎」のユーザーを探したいとき:
user = User.query.filter_by(name="太郎").first()
first()は最初の結果を取り出す方法です。他にもall()で全件取得できます。
3. filterの使い方と比較
filter()はfilter_by()より自由度が高く、<>などの条件も使えます。
users = User.query.filter(User.age >= 20, User.email.like("%@example.com")).all()
User.age >= 20:年齢が20以上like():メールアドレスに@example.comを含む
4. filterとfilter_byの違いまとめ
filter_by(カラム名=値):シンプルな等しい条件filter(条件式):大なり小なり、部分一致など複雑な条件にも対応
5. 複数条件で絞り込む方法
AND条件なら引数を複数渡すだけ。OR条件ならor_()を使います。
from sqlalchemy import or_
# AND条件(複数カラムで絞り込み)
users_and = User.query.filter(User.age>=20, User.active==True).all()
# OR条件(どちらか満たす)
users_or = User.query.filter(or_(User.age<18, User.age>60)).all()
6. 実際に検索結果を表示してみよう
Flaskのルートで検索結果を返す例です。
@app.route("/search")
def search():
age = request.args.get("age", type=int)
users = User.query.filter(User.age>=age).all()
return "<br>".join(u.name for u in users)
request.args.get("age", type=int)は、URLに書かれた?age=20などの数字を取得します。
7. 初心者がつまずくポイント
filter_by()は部分一致には使えないので注意filter()でlike()を使うとき、%を忘れないようにfirst()を使うと結果が一つだけ返るので、全部欲しいときはall()
8. 重要ポイントを整理
- 検索(フィルタリング)はWebアプリで重要な機能
filter_by()は初心者むき、filter()は応用向き- AND, OR, 部分一致など条件指定を上手に使うと便利
まとめ
FlaskとSQLAlchemyを使ったフィルタリング検索は、実際のWebアプリケーションでも欠かせない仕組みであり、初心者が早い段階で習得しておくとアプリ開発の幅が大きく広がります。特に、ユーザー情報や記事データを一覧で扱う場合、必要な行だけを取り出す検索処理は避けて通れません。こうした場面でfilter()やfilter_by()を理解しておくと、「この条件のユーザーだけ表示したい」「特定の文字を含むメールアドレスを抽出したい」といった機能を自然に実装できます。どちらもSQLAlchemyの基本的な検索方法ですが、それぞれの特性を使い分けることが大切です。
filter_by()は「等しい条件」を指定する場面でとても扱いやすく、コードの見通しもよいため最初に覚えるのに向いています。一方で、filter()は大なり小なりや部分一致といった柔軟な条件を使えるため、実務的な検索ニーズにも十分対応できます。また、AND条件・OR条件を組み合わせることで、より複雑な検索ロジックもシンプルに表現できます。特に、or_()との組み合わせは初心者がつまずきやすい部分ですが、一度慣れてしまえばとても使いやすく感じられるはずです。
実際の検索機能をFlaskのルートに組み込む例では、request.args.get()を使ってURLパラメータから値を取得する方法も紹介しました。Webアプリでは、画面のフォームやURLから取得した値を使って検索を行うことが多いため、この流れを理解することは非常に重要です。検索した結果を画面に表示するときも、リストを加工して文字列にしたり、テンプレートへ渡したりといった応用ができるようになります。
今回の内容を振り返ってみると、「検索」というシンプルなテーマでも覚えることは多いですが、そのぶんアプリケーションづくりの基礎として確実に役立つ知識ばかりです。フィルタリングを自在に扱えるようになると、ユーザー管理や記事一覧、商品検索など、より実践的な機能をスムーズに実装できるようになります。特にFlaskとSQLAlchemyの組み合わせはシンプルで扱いやすく、初心者が段階的に学習していくのに最適です。
以下は、今回学んだ内容を踏まえてまとめたサンプルコードです。複数条件を組み合わせて検索する例をもう一度整理し、アプリづくりに活かせるようにしました。
from sqlalchemy import or_
@app.route("/advanced_search")
def advanced_search():
keyword = request.args.get("keyword", "")
min_age = request.args.get("min_age", type=int, default=0)
users = User.query.filter(
User.age >= min_age,
or_(
User.name.like(f"%{keyword}%"),
User.email.like(f"%{keyword}%")
)
).all()
return "<br>".join(f"{u.name}({u.email})" for u in users)
このように、検索条件を複数組み合わせることで、より柔軟で実用的な検索機能が作れます。部分一致で名前やメールアドレスを検索したり、年齢条件と組み合わせたりと、実際のアプリでもよく使うパターンです。検索機能が理解できると、Flaskのアプリ開発は一気に楽しくなっていくはずです。
生徒
「今日の内容で、検索がすごく大切だってわかりました。filterとfilter_byの違い、やっと理解できました!」
先生
「よかった!特に部分一致や複数条件の検索は、Webアプリでよく使うので、今のうちに慣れておくと後で役に立ちますよ。」
生徒
「URLから値を取得して検索に使う仕組みもおもしろかったです。これなら自分でもフォームを作って応用できそうです。」
先生
「その調子!次はテンプレートと組み合わせて検索結果をきれいに表示する方法にも挑戦してみましょう。」
生徒
「はい!今日の内容を実際にコードを書いて試してみます!」