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

Функция column_property

Функция column_property добавляет в модель вычисляемую колонку, значение которой рассчитывается на уровне SQL-запроса. Первым параметром функция принимает SQL-выражение или подзапрос, на основе которого строится значение колонки. Вторым необязательным параметром можно передать параметры отложенной загрузки или деферрирования. Такая колонка доступна как обычный атрибут экземпляра модели, но не хранится в таблице базы данных.

Синтаксис

column_property(expression, [deferred], [group], [expire_on_flush])

Пример

Давайте создадим модель с вычисляемой колонкой, которая возвращает длину заголовка статьи:

from sqlalchemy import create_engine, String, func from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, column_property, 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)) title_length = column_property(func.length(title)) engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: article = Article(title='article') session.add(article) session.commit() res = session.query(Article).first() print(res.title_length)

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

7

Пример

Давайте создадим вычисляемую колонку на основе подзапроса, которая считает количество статей у пользователя:

<+python+> from sqlalchemy import create_engine, String, ForeignKey, select, func from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, column_property, Session class Base(DeclarativeBase): pass class User(Base): __tablename__ = 'users' id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(String(50)) class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String(100)) user_id: Mapped[int] = mapped_column(ForeignKey('users.id')) User.article_count = column_property( select(func.count(Article.id)) .where(Article.user_id == User.id) .correlate_except(Article) .scalar_subquery() ) engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: user = User(name='user') session.add(user) session.flush() session.add_all([ Article(title='article', user_id=user.id), Article(title='article', user_id=user.id), ]) session.commit() res = session.query(User).first() print(res.article_count) <-python+>

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

2

Пример

Давайте посмотрим, какой SQL-запрос генерирует SQLAlchemy для вычисляемой колонки:

<+python+> from sqlalchemy import create_engine, String, func, select from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, column_property class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String(100)) title_length = column_property(func.length(title)) engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) res = select(Article) print(res) <-python+>

Итоговый SQL запрос:

SELECT articles.id, articles.title, length(articles.title) AS title_length FROM articles

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

  • функцию query_expression,
    которая добавляет колонку с выражением запроса
  • функцию deferred,
    которая откладывает загрузку колонки
  • функцию composite,
    которая объединяет несколько колонок в одну
  • функцию mapped_column,
    которая описывает обычную колонку модели
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить