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

Метод with_entities класса Query

Метод with_entities класса Query заменяет список выбираемых сущностей ORM-запроса на переданные аргументы. Вместо целых ORM-объектов можно запрашивать отдельные колонки, выражения, функции и алиасы. Метод принимает произвольное число позиционных аргументов, каждый из которых становится элементом результирующей выборки.

Синтаксис

Query.with_entities(*entities)

Пример

Давайте подготовим модель и добавим несколько записей в таблицу:

from sqlalchemy import create_engine, String from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String(100)) text: Mapped[str] = mapped_column(String(100)) status: Mapped[str] = mapped_column(String(50)) num: Mapped[int] engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: session.add_all([ Article(title='article 1', text='text 1', status='draft', num=1), Article(title='article 2', text='text 2', status='published', num=2), Article(title='article 3', text='text 3', status='published', num=3), ]) session.commit()

Пример

Давайте выберем только колонку title вместо целых ORM-объектов:

from sqlalchemy import create_engine, String from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String(100)) text: Mapped[str] = mapped_column(String(100)) status: Mapped[str] = mapped_column(String(50)) num: Mapped[int] engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: session.add_all([ Article(title='article 1', text='text 1', status='draft', num=1), Article(title='article 2', text='text 2', status='published', num=2), Article(title='article 3', text='text 3', status='published', num=3), ]) session.commit() res = session.query(Article).with_entities(Article.title).all() print(res)

Результат выполнения кода:

[('article 1',), ('article 2',), ('article 3',)]

Пример

Давайте выберем сразу несколько колонок и распакуем их в цикле:

from sqlalchemy import create_engine, String from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String(100)) text: Mapped[str] = mapped_column(String(100)) status: Mapped[str] = mapped_column(String(50)) num: Mapped[int] engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: session.add_all([ Article(title='article 1', text='text 1', status='draft', num=1), Article(title='article 2', text='text 2', status='published', num=2), Article(title='article 3', text='text 3', status='published', num=3), ]) session.commit() res = session.query(Article).with_entities(Article.id, Article.title).all() for row in res: print(row.id, row.title)

Результат выполнения кода:

1 article 1 2 article 2 3 article 3

Пример

Давайте применим метод with_entities вместе с агрегатной функцией:

from sqlalchemy import create_engine, String, func from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String(100)) text: Mapped[str] = mapped_column(String(100)) status: Mapped[str] = mapped_column(String(50)) num: Mapped[int] engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: session.add_all([ Article(title='article 1', text='text 1', status='draft', num=1), Article(title='article 2', text='text 2', status='published', num=2), Article(title='article 3', text='text 3', status='published', num=3), ]) session.commit() res = session.query(Article).with_entities(func.count(Article.id)).scalar() print(res)

Результат выполнения кода:

3

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

  • класс Query,
    который представляет ORM-запрос
  • метод scalar,
    который возвращает первый столбец первой строки
  • метод all,
    который возвращает все строки результата
  • метод group_by,
    который группирует строки по колонкам
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить