Функция or_
Функция or_ создает выражение SQL,
которое объединяет переданные условия через
логический оператор OR. Функция принимает
произвольное количество позиционных аргументов,
каждый из которых является условием или
логическим выражением. Возвращается объект
BooleanClauseList, пригодный для
использования в методах where,
filter и having.
Синтаксис
or_(*clauses)
Пример
Давайте создадим таблицу статей и выберем
записи, у которых заголовок равен
'article' или статус равен
'published':
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, or_
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.begin() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'title': 'article', 'status': 'published'},
{'id': 2, 'title': 'sqlite', 'status': 'draft'},
{'id': 3, 'title': 'article', 'status': 'draft'},
])
stmt = select(articles.c.id, articles.c.title).where(
or_(articles.c.title == 'article', articles.c.status == 'published')
)
with engine.connect() as conn:
res = conn.execute(stmt).fetchall()
print(res)
Результат выполнения кода:
[(1, 'article'), (3, 'article')]
Пример
Функция or_ может объединять три и
более условий. Выберем статьи, у которых
заголовок равен 'article', или статус
равен 'published', или идентификатор
равен 2:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, or_
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.begin() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'title': 'article', 'status': 'published'},
{'id': 2, 'title': 'sqlite', 'status': 'draft'},
{'id': 3, 'title': 'article', 'status': 'draft'},
])
stmt = select(articles.c.id).where(
or_(
articles.c.title == 'article',
articles.c.status == 'published',
articles.c.id == 2,
)
)
with engine.connect() as conn:
res = conn.execute(stmt).fetchall()
print(res)
Результат выполнения кода:
[(1,), (2,), (3,)]
Пример
Функцию or_ удобно комбинировать с
функцией and_ для построения сложных
логических выражений. Выберем статьи, у
которых заголовок равен 'article', и при
этом статус равен 'published' или
'draft':
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, or_, and_
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.begin() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'title': 'article', 'status': 'published'},
{'id': 2, 'title': 'sqlite', 'status': 'draft'},
{'id': 3, 'title': 'article', 'status': 'draft'},
])
stmt = select(articles.c.id).where(
and_(
articles.c.title == 'article',
or_(articles.c.status == 'published', articles.c.status == 'draft'),
)
)
with engine.connect() as conn:
res = conn.execute(stmt).fetchall()
print(res)
Результат выполнения кода:
[(1,), (3,)]
Итоговый SQL запрос:
SELECT articles.id
FROM articles
WHERE articles.title = 'article'
AND (articles.status = 'published' OR articles.status = 'draft')