カテゴリ: Flask 更新日: 2025/12/08

FlaskのSQLAlchemyでフィルタリング検索!filter, filter_byの使い方完全ガイド

FlaskのSQLAlchemyでフィルタリング検索を行う方法!filter, filter\_byの活用
FlaskのSQLAlchemyでフィルタリング検索を行う方法!filter, filter\_byの活用

先生と生徒の会話形式で理解しよう

生徒

「Flaskで作ったアプリで、特定のユーザーだけ表示したいです。どうすればいいですか?」

先生

「そのときに使うのがfilterfilter_byですよ。これはデータベースから必要な行を絞り込むための検索方法です。」

生徒

「えっと、検索…難しそう…。初心者でも使えますか?」

先生

「大丈夫!条件を指定するだけで、必要なデータを簡単に取り出せます。一緒にやり方を見てみましょう!」

1. filterとfilter_byって何?

1. 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の基本的な使い方

2. filter_byの基本的な使い方
2. filter_byの基本的な使い方

たとえば、Userモデルで「nameが太郎」のユーザーを探したいとき:


user = User.query.filter_by(name="太郎").first()

first()は最初の結果を取り出す方法です。他にもall()で全件取得できます。

3. filterの使い方と比較

3. filterの使い方と比較
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の違いまとめ

4. filterとfilter_byの違いまとめ
4. filterとfilter_byの違いまとめ
  • filter_by(カラム名=値):シンプルな等しい条件
  • filter(条件式):大なり小なり、部分一致など複雑な条件にも対応

5. 複数条件で絞り込む方法

5. 複数条件で絞り込む方法
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. 実際に検索結果を表示してみよう

6. 実際に検索結果を表示してみよう
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. 初心者がつまずくポイント

7. 初心者がつまずくポイント
7. 初心者がつまずくポイント
  • filter_by()は部分一致には使えないので注意
  • filter()like()を使うとき、%を忘れないように
  • first()を使うと結果が一つだけ返るので、全部欲しいときはall()

8. 重要ポイントを整理

8. 重要ポイントを整理
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のアプリ開発は一気に楽しくなっていくはずです。

先生と生徒の振り返り会話

生徒

「今日の内容で、検索がすごく大切だってわかりました。filterfilter_byの違い、やっと理解できました!」

先生

「よかった!特に部分一致や複数条件の検索は、Webアプリでよく使うので、今のうちに慣れておくと後で役に立ちますよ。」

生徒

「URLから値を取得して検索に使う仕組みもおもしろかったです。これなら自分でもフォームを作って応用できそうです。」

先生

「その調子!次はテンプレートと組み合わせて検索結果をきれいに表示する方法にも挑戦してみましょう。」

生徒

「はい!今日の内容を実際にコードを書いて試してみます!」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

FlaskとSQLAlchemyでfilterとfilter_byの違いは何ですか?初心者でも理解できますか?

filterは条件式を使った柔軟な検索ができ、filter_byはシンプルに「カラム名=値」で検索できます。初心者にはfilter_byの方がわかりやすくおすすめです。
カテゴリの一覧へ
新着記事
New1
Flask
FlaskでCSRF対策を実装する方法!安全なフォーム送信を学ぼう
New2
Python
Pythonの文字列型(str)を完全解説!連結・分割・検索の方法を紹介
New3
Python
Pythonで日付文字列から曜日を取得する方法を完全ガイド!初心者でもわかる日時処理入門
New4
Flask
FlaskアプリのSSL設定方法をやさしく解説!初心者でもわかるHTTPS対応の手順
人気記事
No.1
Java&Spring記事人気No1
Django
Django環境構築の全手順を完全解説!初心者でも迷わないPython・Djangoセットアップガイド
No.2
Java&Spring記事人気No2
Python
Pythonの文字列を1文字ずつ処理する方法!for文やlist化の活用例
No.3
Java&Spring記事人気No3
Flask
FlaskアプリをNginx + Gunicornで本番運用する方法!初心者でもわかるデプロイ構成の基本
No.4
Java&Spring記事人気No4
Python
Pythonでリストをコピーする方法!copy()・スライス・list()の使い方を比較
No.5
Java&Spring記事人気No5
Python
Pythonでリストを文字列に変換する方法を完全ガイド!初心者でもわかるjoinの使い方
No.6
Java&Spring記事人気No6
Python
PythonでHello Worldを表示するには?初心者向けに最初の1行を実行してみよう
No.7
Java&Spring記事人気No7
Flask
Flaskとは何か?初心者向けにできること・特徴・インストール手順までやさしく解説
No.8
Java&Spring記事人気No8
Flask
FlaskアプリのSECRET_KEYの設定方法を完全ガイド!初心者でもわかるセキュリティ対策