Для чего используется объект func в SQLAlchemy?

Ответ

В SQLAlchemy func — это специальный объект-генератор, который предоставляет доступ к SQL-функциям (агрегатным, строковым, математическим и др.) непосредственно из Python-кода.

Это позволяет конструировать сложные запросы, не прибегая к написанию "сырого" SQL, сохраняя при этом все преимущества ORM: переносимость между разными СУБД и интеграцию с моделями данных.

Основные группы функций

  • Агрегатные: func.count(), func.sum(), func.avg(), func.max().
  • Строковые: func.lower(), func.concat(), func.substring().
  • Даты и времени: func.now(), func.date().
  • Специфичные для СУБД: func.json_build_object() (PostgreSQL) и другие.

Пример использования (синтаксис SQLAlchemy 2.0)

Предположим, у нас есть модель User:

from sqlalchemy.orm import Mapped, mapped_column, DeclarativeBase

class Base(DeclarativeBase): pass

class User(Base):
    __tablename__ = 'users'
    id: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str]
    visit_count: Mapped[int]

Теперь мы можем использовать func в запросах:

from sqlalchemy import select, func
from sqlalchemy.orm import Session

# ... (engine и session настроены)

with Session(engine) as session:
    # 1. Подсчет всех пользователей
    count_stmt = select(func.count(User.id))
    user_count = session.execute(count_stmt).scalar_one()
    # SQL: SELECT count(users.id) FROM users

    # 2. Поиск пользователя с именем в нижнем регистре
    lower_name_stmt = select(User).where(func.lower(User.name) == "john")
    # SQL: SELECT ... FROM users WHERE lower(users.name) = 'john'

    # 3. Суммирование значений по полю
    total_visits_stmt = select(func.sum(User.visit_count))
    total_visits = session.execute(total_visits_stmt).scalar()
    # SQL: SELECT sum(users.visit_count) FROM users