Метод bool_op
Метод bool_op класса ColumnElement создает
булево выражение, применяя к колонке произвольный
SQL-оператор. Первым параметром метод принимает
строку с именем оператора, а вторым - значение,
с которым сравнивается колонка. В отличие от метода
op, метод bool_op автоматически оборачивает
результат в логическое выражение, пригодное для
использования в where, having и других
условиях фильтрации.
Синтаксис
ColumnElement.bool_op(opstring, *other)
Пример
Давайте создадим таблицу и применим метод bool_op
для сравнения колонки с оператором IS DISTINCT FROM:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('status', String),
)
metadata.create_all(engine)
stmt = select(articles.c.title).where(
articles.c.status.bool_op('IS DISTINCT FROM')('article')
)
print(stmt)
Итоговый SQL запрос:
SELECT articles.title
FROM articles
WHERE articles.status IS DISTINCT FROM ?
Пример
Давайте выполним запрос с методом bool_op
на реальных данных и посмотрим результат:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('status', String),
)
metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'title': 'article 1', 'status': 'article'},
{'id': 2, 'title': 'article 2', 'status': 'user'},
{'id': 3, 'title': 'article 3', 'status': 'sqlite'},
])
conn.commit()
stmt = select(articles.c.title).where(
articles.c.status.bool_op('IS DISTINCT FROM')('article')
)
res = conn.execute(stmt).scalars().all()
print(res)
Результат выполнения кода:
['article 2', 'article 3']
Пример
Давайте применим метод bool_op с оператором
ILIKE для нечувствительного к регистру поиска:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('status', String),
)
metadata.create_all(engine)
stmt = select(articles.c.title).where(
articles.c.title.bool_op('ILIKE')('%article%')
)
print(stmt)
Итоговый SQL запрос:
SELECT articles.title
FROM articles
WHERE articles.title ILIKE ?
Смотрите также
-
класс
ColumnElement,
который представляет базовый элемент колонки -
метод
op,
который создает произвольный оператор без булева контекста -
метод
like,
который выполняет поиск по шаблону -
метод
in_,
который проверяет вхождение в набор значений