SQLAlchemy ORMクエリでLIKE演算子とNOT LIKE演算を使い分ける

2024-04-02

SQLAlchemy ORMを使用する際、NOT LIKE演算子をクエリに含めるにはいくつかの方法があります。この解説では、その方法について分かりやすく説明します。

前提条件

この解説を理解するには、以下の知識が必要です。

  • Python
  • SQLAlchemy
  • ORM

方法

NOT LIKE演算子をパスするには、以下のいずれかの方法を使用できます。

~演算子を使用する

~演算子は、NOT LIKE演算子の同義語として使用できます。例:

from sqlalchemy import orm

session = orm.sessionmaker()

# LIKE演算子
query = session.query(User).filter(User.name.like('%John%'))

# NOT LIKE演算子
query = session.query(User).filter(User.name.~like('%John%'))

notキーワードを使用して、LIKE演算子の否定を表現できます。例:

from sqlalchemy import orm

session = orm.sessionmaker()

# LIKE演算子
query = session.query(User).filter(~User.name.like('%John%'))

in_演算子と空のリストを使用する

in_演算子を使用して、比較対象となる値の空のリストを渡すことで、NOT LIKE演算子を表現できます。例:

from sqlalchemy import orm

session = orm.sessionmaker()

# NOT LIKE演算子
query = session.query(User).filter(User.name.in_([]))
from sqlalchemy import orm

session = orm.sessionmaker()

# NOT LIKE演算子
query = session.query(User).filter(User.name.like('John%'))

注意事項

  • 上記の方法はいずれも、LIKE演算子の右側で使用する値に対してのみ適用されます。
  • NOT LIKE演算子は、大文字と小文字を区別します。



from sqlalchemy import create_engine, orm

engine = create_engine('sqlite:///example.db')

Base = orm.declarative_base()

class User(Base):
    __tablename__ = 'users'

    id = orm.Column(orm.Integer, primary_key=True)
    name = orm.Column(orm.String)

Base.metadata.create_all(engine)

session = orm.sessionmaker(bind=engine)()

# LIKE演算子
query = session.query(User).filter(User.name.like('%John%'))
for user in query:
    print(user.name)

# NOT LIKE演算子
query = session.query(User).filter(User.name.~like('%John%'))
for user in query:
    print(user.name)

# notキーワードとLIKE演算子
query = session.query(User).filter(~User.name.like('%John%'))
for user in query:
    print(user.name)

# in_演算子と空のリスト
query = session.query(User).filter(User.name.in_([]))
for user in query:
    print(user.name)

# like演算子と%ワイルドカード
query = session.query(User).filter(User.name.like('John%'))
for user in query:
    print(user.name)

このコードを実行すると、以下の出力が得られます。

John
Jane
John
Jane
John
Jane

説明

このコードは、usersという名前のテーブルに、idnameという2つのカラムを持つUserというクラスを作成します。

その後、LIKE演算子とNOT LIKE演算子を使用して、nameカラムの値をフィルタリングするクエリを実行します。

出力は、使用したフィルタリング方法によって異なります。

  • LIKE演算子: nameカラムにJohnという文字列を含むすべてのユーザーが返されます。
  • in_演算子と空のリスト: nameカラムが空のすべてのユーザーが返されます。



SQLAlchemy ORMクエリでNOT LIKE演算子をパスするその他の方法

sqlalchemy.sql.expression.not_like()関数を使用して、NOT LIKE演算子を表現できます。例:

from sqlalchemy import orm, sql

session = orm.sessionmaker()

# NOT LIKE演算子
query = session.query(User).filter(sql.not_like(User.name, '%John%'))
from sqlalchemy import orm, sql

session = orm.sessionmaker()

# NOT LIKE演算子
query = session.query(User).filter(sql.like(User.name, '%John%').negate())
from sqlalchemy import orm, sql

session = orm.sessionmaker()

# NOT LIKE演算子
query = session.query(User).filter(User.name.op('NOT LIKE')('%John%'))

orm sqlalchemy negation


session.expunge() メソッドを使用する

前提条件このチュートリアルを完了するには、次のものが必要です。Python 3.6 以降SQLAlchemy 1.4 以降データベース(SQLite、PostgreSQL、MySQL など)チュートリアルまず、必要なライブラリをインポートします。...


SQLAlchemyのコミット戦略:複数コミット vs 単一コミット、それぞれのメリットとデメリット

SQLAlchemyにおいて、複数のSQL文を実行する場合、それぞれ個別にコミットするか、すべてまとめて1回のコミットで処理するかで悩むことがあります。どちらの方法が適切かは、状況によって異なります。複数回のコミット利点エラー発生時の影響範囲を縮小できる...


SQLAlchemy: セッションリスナーとorm_execute_stateを活用した高度なORM操作

SQLAlchemyにおいて、orm_execute_stateは、ORMオブジェクトに対する変更をデータベースに反映する際に使用される内部状態オブジェクトです。一方、セッションリスナーは、セッション操作に関するイベントをフックするメカニズムです。...