← Назад к вопросам

Что такое funk в SQLAlchemy?

1.8 Middle🔥 181 комментариев
#Базы данных (SQL)

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое 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.
Что такое funk в SQLAlchemy? | PrepBro