Функция all_
Функция all_ создает SQL-выражение
value = ALL (subquery). Она принимает
первым параметром колонку или выражение для сравнения,
а вторым параметром - подзапрос или выражение select.
Функция возвращает объект BinaryExpression,
который можно использовать в условиях WHERE,
HAVING и других частях запроса.
Оператор ALL возвращает истину, только если
сравнение с каждым элементом подзапроса дает истину.
Если подзапрос не возвращает строк, результат считается
истинным по правилам SQL.
Синтаксис
all_(expr, subquery)
Пример
Давайте создадим таблицу статей и проверим, что числовое значение больше всех значений в подзапросе:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, all_
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('num', Integer),
)
metadata.create_all(engine)
with engine.begin() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'title': 'article', 'num': 10},
{'id': 2, 'title': 'article', 'num': 20},
{'id': 3, 'title': 'article', 'num': 30},
])
stmt = select(articles.c.title).where(
all_(articles.c.num, select(articles.c.num))
)
with engine.connect() as conn:
res = conn.execute(stmt).fetchall()
print(res)
Результат выполнения кода:
[]
Пример
Давайте сравним значение с подзапросом, который возвращает меньший набор чисел, и посмотрим на результат:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, all_
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('num', Integer),
)
metadata.create_all(engine)
with engine.begin() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'title': 'article', 'num': 10},
{'id': 2, 'title': 'article', 'num': 20},
{'id': 3, 'title': 'article', 'num': 30},
])
subq = select(articles.c.num).where(articles.c.num < 25)
stmt = select(articles.c.title).where(
all_(articles.c.num > 5, subq)
)
with engine.connect() as conn:
res = conn.execute(stmt).fetchall()
print(res)
Результат выполнения кода:
[('article',), ('article',), ('article',)]
Пример
Давайте посмотрим, какой SQL-запрос генерирует функция
all_:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, all_
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('num', Integer),
)
stmt = select(articles.c.title).where(
all_(articles.c.num, select(articles.c.num).where(articles.c.num > 5))
)
print(stmt)
Итоговый SQL запрос:
SELECT articles.title
FROM articles
WHERE articles.num = ALL (SELECT articles.num
FROM articles
WHERE articles.num > 5)