
Часто при работе с базами данных возникает необходимость извлекать уникальные значения из определенного столбца или даже нескольких столбцов. SQLAlchemy предоставляет удобный метод distinct(), который позволяет легко выполнить такие запросы. В этой статье мы рассмотрим, как работает distinct(), и как его можно применить для решения различных задач.
Функция distinct() в основном используется для удаления дубликатов из результата запроса.
Пример:
Допустим, у нас есть модель User, и мы хотим получить список уникальных профессий пользователей.
from sqlalchemy.orm import sessionmaker
from my_database import User, engine
Session = sessionmaker(bind=engine)
session = Session()
unique_professions = session.query(User.profession).distinct().all()
for profession in unique_professions:
print(profession)В этом примере distinct() гарантирует, что каждая профессия будет представлена в результате только один раз.
Если у вас есть необходимость получить уникальные комбинации из нескольких столбцов, вы можете передать несколько аргументов в distinct():
unique_name_professions = session.query(User.name, User.profession).distinct(User.name, User.profession).all()distinct() может быть комбинирован с другими операциями, такими как filter(), group_by() и др. Например, вы можете выбрать уникальные профессии пользователей, которые зарегистрированы в определенном году:
unique_professions_2022 = (
session.query(User.profession)
.filter(User.registration_year == 2022)
.distinct()
.all()
)distinct() могут быть медленными на больших наборах данных, особенно если не используются индексы.distinct() имеет значение. distinct(A, B) может вернуть другой результат, чем distinct(B, A).NULL значения считаются разными. То есть, если у вас есть две строки с NULL в определенном столбце, обе строки будут включены в результат запроса с distinct().При использовании distinct() в сочетании с order_by(), убедитесь, что столбцы, указанные в order_by(), также указаны в distinct(). В противном случае вы можете получить неожиданные результаты, так как порядок сортировки будет основан на всех столбцах, а не только на уникальных.
# Правильно
results = session.query(User.profession).distinct(User.profession).order_by(User.profession).all()
# Неправильно
results = session.query(User.profession).distinct(User.profession).order_by(User.name).all()Хотя distinct() и group_by() могут казаться очень похожими, они служат разным целям:
distinct() используется для получения уникальных значений или комбинаций столбцов.group_by() используется для группировки значений, часто в сочетании с агрегатными функциями, такими как sum(), count(), avg() и т. д.Однако, в некоторых случаях, group_by() может использоваться как замена distinct(), особенно если вы хотите выполнять агрегатные операции на уникальных значениях.
Если вы столкнулись с проблемами производительности при использовании distinct(), рассмотрите возможность добавления индексов на столбцы, участвующие в операции distinct(). Индексы могут существенно ускорить выполнение запроса.
Функция distinct() в SQLAlchemy – это мощный инструмент, который позволяет легко и быстро извлекать уникальные значения или комбинации значений из вашей базы данных. Однако, как и любой другой инструмент, он требует внимательного и обдуманного использования, особенно на больших объемах данных или при сложных запросах.
Содержание: