Ответ
В 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