Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое func в SQLAlchemy
func — это специальный объект в SQLAlchemy, который позволяет использовать функции базы данных в Python коде. Это мощный инструмент для выполнения SQL функций прямо в ORM запросах, без необходимости писать raw SQL.
Основной концепт
func — это **функциональный прокси**, который динамически создает SQL функции в момент использования. Он позволяет вам вызывать практически любую функцию БД, которая поддерживается вашей базой данных (PostgreSQL, MySQL, SQLite и т.д.).
Импорт и базовое использование
from sqlalchemy import func, select
from sqlalchemy.orm import Session
from myapp.models import User
# Подсчет количества пользователей
count_query = select(func.count(User.id)).select_from(User)
result = session.execute(count_query).scalar()
print(result) # Например: 42
Примеры часто используемых функций
# COUNT — количество записей
count = select(func.count(User.id))
# SUM — сумма значений
total_age = select(func.sum(User.age))
# AVG — среднее значение
avg_score = select(func.avg(Task.score))
# MAX/MIN — максимум/минимум
max_date = select(func.max(User.created_at))
min_price = select(func.min(Product.price))
# UPPER/LOWER — преобразование регистра
upper_name = select(func.upper(User.name))
# CONCAT — объединение строк
full_name = select(func.concat(User.first_name, " ", User.last_name))
# LENGTH — длина строки
name_length = select(func.length(User.name))
# COALESCE — возврат первого не-null значения
username = select(func.coalesce(User.nickname, User.email))
# DATE функции
today_users = select(func.date(User.created_at))
Практические примеры
GROUP BY с func
from sqlalchemy import func, select
from myapp.models import Order, User
# Получить количество заказов по пользователям
query = (
select(
User.id,
User.name,
func.count(Order.id).label("order_count")
)
.join(Order)
.group_by(User.id, User.name)
)
results = session.execute(query).all()
for user_id, name, count in results:
print(f"{name}: {count} заказов")
HAVING с условием
# Найти пользователей с более чем 5 заказами
query = (
select(
User.id,
User.name,
func.count(Order.id).label("order_count")
)
.join(Order)
.group_by(User.id, User.name)
.having(func.count(Order.id) > 5)
)
Использование с WHERE
# Найти пользователей, чье имя содержит "john" (в любом регистре)
query = select(User).where(
func.lower(User.name).contains("john")
)
Функции, специфичные для БД
# PostgreSQL
from sqlalchemy.dialects.postgresql import UUID
# JSON функции PostgreSQL
query = select(User).where(
func.jsonb_contains(User.data, "\"key\"")
)
# MySQL REGEX
query = select(User).where(
func.regexp_like(User.email, "^[a-zA-Z]+@example\\.com$")
)
Важные моменты
Типизация результатов: func возвращает Expression объект, который SQLAlchemy преобразует в правильный SQL. Используй .label() для именования результатов в GROUP BY запросах.
Совместимость: Разные БД поддерживают разные функции. PostgreSQL имеет больше функций, чем SQLite. Проверяй документацию вашей БД.
Производительность: Функции БД выполняются на сервере, что быстрее, чем обработка в Python. Используй их для расчетов и фильтрации данных.
Композиция функций: Можно комбинировать несколько функций:
# Средняя длина имени пользователя
avg_name_length = select(func.avg(func.length(User.name)))
Резюме
func в SQLAlchemy — это ваш способ **использовать мощь базы данных** без написания raw SQL. Это повышает читаемость кода, безопасность (защита от SQL injection) и позволяет ORM оптимизировать запросы. Освоение func критично для эффективной работы с SQLAlchemy.