Функция 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
Пример
Давайте создадим вычисляемую колонку на основе подзапроса, которая считает количество статей у пользователя:
Результат выполнения кода:
2
Пример
Давайте посмотрим, какой SQL-запрос генерирует SQLAlchemy для вычисляемой колонки:
Итоговый SQL запрос:
SELECT articles.id, articles.title, length(articles.title) AS title_length
FROM articles
Смотрите также
-
функцию
query_expression,
которая добавляет колонку с выражением запроса -
функцию
deferred,
которая откладывает загрузку колонки -
функцию
composite,
которая объединяет несколько колонок в одну -
функцию
mapped_column,
которая описывает обычную колонку модели