✅ Решения: ответы на контрольные вопросы

⚡ Ответы

  • 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: Метод для получения всех объектов

Ответ: C — .all()

Метод .all() возвращает список всех объектов, соответствующих запросу. Если результатов нет — возвращает пустой список [], а не None.

users = session.scalars(select(User)).all()   # список

Вопрос 4: Метод, выбрасывающий исключение при >1 объектах

Ответ: B — .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

Ответ: B — .filter()

Метод .filter() (в 1.x) и .where() (в 2.x) задают условия выборки, аналогично WHERE в SQL. В SQLAlchemy 2.x рекомендуется использовать .where().

Вопрос 7: Функция для фильтрации по диапазону

Ответ: B — 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: Метод сортировки

Ответ: C — .order_by()

Метод .order_by() устанавливает порядок сортировки результата. Методов .sort(), .order() и .sort_by() в SQLAlchemy нет.

Вопрос 10: Функция desc()

Ответ: B — сортирует данные по убыванию

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)