始めに
email等の項目は大文字小文字を区別せずに比較したいことがあります。
その場合には小文字化して比較することになります。今回の記事では、PythonのSQLAlchemyで使用するlowerとilikeを素振りします。
環境
- 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
ilikeはinsensitive 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)
ソースコード
- https://github.com/hirotoKirimaru/fastapi-practice/blob/7e291f8493ed29b36949b9781ecdcc6cf8a8cf4d/src/cruds/user.py#L31
- https://github.com/hirotoKirimaru/fastapi-practice/blob/b6396205ca56f428742f4c1c24f48baf86bee2ea/tests/unit/cruds/test_user.py#L160
終わりに
PostgreSQLにILIKEなんて便利な演算子があるのを調べてはじめて知りました。こういう知らない方向からの知見を得られるので、ブログはいいですね。