Фильтрация по дате рождения в SQLAlchemy: выборка по возрасту
Быстрый ответ
Для выполнения фильтрации поля с датой в SQLAlchemy примените метод filter
к объекту datetime.date
. Рассмотрим случай с моделью User
и полем даты created_at
:
from your_model import User
from datetime import date
# Выбираем пользователей, зарегистрировавшихся в Новый год 2023.
users = session.query(User).filter(User.created_at == date(2023, 1, 1)).all()
Замените date(2023, 1, 1)
на дату, которая вам интересна, и получите список пользователей, зарегистрировавшихся в этот день.
Работа с диапазонами дат
Если задача состоит в фильтрации пользователей по диапазону дат, примените метод between
, как показано ниже:
# Ищем пользователей, зарегистрировавшихся в январе 2023 года.
users = session.query(User).filter(
User.created_at.between(date(2023, 1, 1), date(2023, 1, 31))
).all()
Обязательно проверьте совпадение формата даты с тем, что используется в базе данных. Это поможет избежать появления ошибок.
Работа с временем
Если вам требуется исключительно дата без времени, используйте func.date
. Чтобы отбросить время, выполните следующую операцию:
from sqlalchemy import func
# Нас интересует только дата регистрации.
users = session.query(User).filter(
func.date(User.created_at) == date(2023, 1, 1)
).all()
Сложные запросы с цепочками фильтров
Для составления сложных запросов с множественными условиями используйте цепочку фильтров:
from sqlalchemy import and_
# Ищем пользователей, зарегистрировавшихся в январе 2023 года.
users = session.query(User).filter(
and_(
User.created_at >= date(2023, 1, 1),
User.created_at <= date(2023, 1, 31)
)
).all()
Чтобы контролировать и понимать вывод SQL-запросов, выведите тот на экран:
# Весь SQL-запрос
print(users)
Работа с промежутками времени
С помощью функции timedelta
можно работать с промежутками времени, например, определить даты в прошлом:
from datetime import timedelta
# Ищем пользователей, рожденных 20 и 30 лет назад.
start_date = date.today() – timedelta(days=365*20) # 20 лет назад
end_date = date.today() – timedelta(days=365*30) # 30 лет назад
users = session.query(User).filter(
User.birth_date.between(end_date, start_date)
).all()
Улучшение вывода данных с помощью Flask-Marshmallow
Для удобного отображения данных запросов во Flask используйте Flask-Marshmallow:
from flask import jsonify
from your_application import ma
class UserSchema(ma.Schema):
class Meta:
fields = ('id', 'username', 'created_at')
# Сериализуем и выводим данные.
user_schema = UserSchema()
users = session.query(User).filter(User.created_at == date(2023, 1, 1)).all()
output = user_schema.dump(users, many=True)
return jsonify(output)
jsonify
и schema.dump
помогают наглядно представить результаты запроса.
Отладка и проверка
Когда вы фильтруете по датам, всегда уделяйте особое внимание:
- Включению обоих границ при работе с диапазонами дат.
- Адекватности операторов сравнения (
>=
,<=
). - Логической корректности работы с датами.
Визуализация
Использование SQLAlchemy для фильтрации по датам аналогично отметке важных дат в календаре:
# Фильтрация дат в SQLAlchemy (📅)
Первоначальные записи: [🔍 Все события]
После применения фильтрации: [Только события от '2023-01-01' 🔵]
# Отмечаем событие на '2023-01-01'
filtered_events = session.query(Event).filter(Event.date == '2023-01-01').all()
[📅: 🔍] -> [📅: 🔵]
# Фильтрация помогает сфокусировать внимание!
Полезные материалы
- Query API — SQLAlchemy 1.4 Documentation — документация SQLAlchemy по операторам фильтрации.
- Selecting Rows with Core or ORM — SQLAlchemy 1.4 Documentation — подробное руководство по методам фильтрации данных в SQLAlchemy.
- Type Hierarchy — SQLAlchemy 1.4 Documentation — описание типов дат, времени и интервалов в SQLAlchemy.
- Column Elements and Expressions — SQLAlchemy 1.4 Documentation — информация о методах и управляющих операторах для фильтрации данных по дате.
- Python strftime reference cheatsheet — шпаргалка по шаблонам форматирования дат в Python.