✅ Решения: ответы на контрольные вопросы
⚡ Ответы
- Q1: 1→C, 2→D, 3→A, 4→B
- Q2:
commit() - Q3: C —
.all() - Q4: B —
.one()и D —.one_or_none() - Q5: Неверно —
.first()возвращает None при пустом результате - Q6: B —
.filter() - Q7: B —
between() - Q8: Верно
- Q9: C —
.order_by() - Q10: B — сортирует по убыванию
- Q11: Неверно — можно передать несколько аргументов
Блок 1: CRUD операции
Вопрос 1: Сопоставление CRUD
- 1 — Создание (Create) → C — Добавление новых записей в базу данных
- 2 — Чтение (Read) → D — Доступ к данным в базе данных
- 3 — Обновление (Update) → A — Изменение существующих данных
- 4 — Удаление (Delete) → B — Удаление данных из базы данных
Вопрос 2: Метод фиксации изменений
commit()
Метод session.commit() фиксирует все изменения текущей транзакции в базе данных. До вызова commit() изменения существуют только в памяти и теряются при закрытии сессии.
Блок 2: Построение запросов
Вопрос 3: Метод для получения всех объектов
.all()
Метод .all() возвращает список всех объектов, соответствующих запросу. Если результатов нет — возвращает пустой список [], а не None.
users = session.scalars(select(User)).all() # список
Вопрос 4: Метод, выбрасывающий исключение при >1 объектах
.one() и D — .one_or_none()
Оба метода выбрасывают MultipleResultsFound при более чем одном результате. Различие — при пустом результате: .one() выбрасывает NoResultFound, а .one_or_none() возвращает None.
Вопрос 5: .first() всегда возвращает объект?
Метод .first() возвращает первый объект или None, если результат пустой. Поэтому всегда проверяйте результат перед использованием:
user = session.scalars(select(User)).first()
if user: # обязательная проверка!
print(user.name)
Блок 3: Фильтрация
Вопрос 6: Метод-аналог WHERE
.filter()
Метод .filter() (в 1.x) и .where() (в 2.x) задают условия выборки, аналогично WHERE в SQL. В SQLAlchemy 2.x рекомендуется использовать .where().
Вопрос 7: Функция для фильтрации по диапазону
between()
Функция .between(a, b) фильтрует значения в диапазоне [a, b] включительно. Аналог SQL: WHERE id BETWEEN 2 AND 4.
stmt = select(User).where(User.id.between(2, 4))
Вопрос 8: or_() с двумя условиями
or_(User.age > 30, User.name == 'David') вернёт всех пользователей, у которых возраст больше 30 ИЛИ имя равно 'David'. Оба условия проверяются независимо, и достаточно выполнения любого из них.
Блок 4: Сортировка
Вопрос 9: Метод сортировки
.order_by()
Метод .order_by() устанавливает порядок сортировки результата. Методов .sort(), .order() и .sort_by() в SQLAlchemy нет.
Вопрос 10: Функция desc()
desc(поле) — функция, указывающая сортировку по убыванию (DESCENDING). По умолчанию order_by() сортирует по возрастанию.
from sqlalchemy import desc
stmt = select(User).order_by(desc(User.age)) # от большего к меньшему
Вопрос 11: order_by() — только один критерий?
Метод .order_by() принимает несколько аргументов — это многоуровневая сортировка. Первый аргумент — основной, второй — тiebreaker при равенстве первого:
# Сначала убывающий возраст, затем по имени алфавитно
stmt = select(User).order_by(desc(User.age), User.name)