РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
233 of 711 menu

Метод 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"

Смотрите также

  • метод correlate,
    который включает указанные таблицы в корреляцию
  • класс Select,
    который представляет SELECT-запрос
  • метод subquery,
    который превращает запрос в подзапрос
  • метод where,
    который добавляет условие фильтрации
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить