きり丸の技術日記

技術検証したり、資格等をここに残していきます。

SQLAlchemyで大文字小文字を区別せず比較する(lower, ilike)

始めに

email等の項目は大文字小文字を区別せずに比較したいことがあります。

その場合には小文字化して比較することになります。今回の記事では、PythonのSQLAlchemyで使用するlowerilikeを素振りします。

環境

  • Python
    • 3.12.3
  • SQLAlchemy
    • 2.0.31

lower

DB側で補完しているデータもlowerとするときにはfunc.lowerを使用します。渡すパラメータに関してはPythonのlowerを使用してください。

select(User).where(func.lower(User.email) == parameter.lower())

ilike

ilikeinsensitive LIKEの略称です。大文字小文字を区別しない文字列マッチングを行います。

PostgreSQLでは、ILIKE演算子がありますので、SQLAlchemy独自の構文ではありません。

select(User).where(User.email.ilike(f"%{email}%"))

ILIKE演算子はPostgreSQL固有の拡張機能ですが、SQLAlchemyでは他のデータベースでも同様の結果を出力してくれるようにlowerしたものと同等の機能を提供してくれます。

# queryを文字列化
# SELECT *
# FROM users
# WHERE lower(users.email) LIKE lower(:email_1)

ソースコード

終わりに

PostgreSQLILIKEなんて便利な演算子があるのを調べてはじめて知りました。こういう知らない方向からの知見を得られるので、ブログはいいですね。