Метод correlate_except
Метод correlate_except класса Select
позволяет исключить указанные таблицы из
автоматической корреляции. Корреляция - это
механизм, при котором подзапрос автоматически
ссылается на внешние таблицы из основного
запроса, не включая их в свой блок FROM.
Метод принимает одну или несколько таблиц
(или ORM-сущностей), которые не должны
подвергаться корреляции.
Этот метод полезен в случаях, когда нужно
точно управлять тем, какие таблицы подзапрос
будет считать внешними, а какие - включит
в собственный блок FROM.
Синтаксис
select(...).correlate_except(*tables)
Пример
Давайте создадим две таблицы и построим запрос с подзапросом, исключив одну из таблиц из корреляции:
from sqlalchemy import create_engine, select, func, Table, Column, Integer, String, MetaData
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('num', Integer),
)
users = Table(
'users', metadata,
Column('id', Integer, primary_key=True),
Column('name', String),
)
subq = select(func.count(articles.c.id)).correlate_except(users)
stmt = select(users.c.name, subq.scalar_subquery())
print(stmt)
Результат выполнения кода:
"SELECT users.name, (SELECT count(articles.id) AS count_1 \nFROM articles) AS anon_1 \nFROM users"
Пример
Давайте рассмотрим разницу между
correlate и correlate_except
на примере с двумя внешними таблицами:
from sqlalchemy import create_engine, select, func, Table, Column, Integer, String, MetaData
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('num', Integer),
)
users = Table(
'users', metadata,
Column('id', Integer, primary_key=True),
Column('name', String),
)
subq = select(func.count(articles.c.id))
subq = subq.correlate_except(users)
stmt = select(users.c.name, articles.c.title, subq.scalar_subquery())
stmt = stmt.select_from(users.join(articles, users.c.id == articles.c.id))
print(stmt)
Результат выполнения кода:
"SELECT users.name, articles.title, (SELECT count(articles.id) AS count_1 \nFROM articles) AS anon_1 \nFROM users JOIN articles ON users.id = articles.id"