SQLAlchemy ORMクエリでLIKE演算子とNOT LIKE演算を使い分ける
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
という名前のテーブルに、id
とname
という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