始めに
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
なんて便利な演算子があるのを調べてはじめて知りました。こういう知らない方向からの知見を得られるので、ブログはいいですね。