🏠 Домашнее задание — Summary session 2

🎯 Повторение блока SQLAlchemy ⏱️ ~60 мин

Это не LMS-задание, а самостоятельная закрепляющая практика. В Summary session 2 новых задач в LMS не выдавалось — урок посвящён повторению. Используйте это задание для проверки знаний блока SQLAlchemy. Если у вас есть незакрытое ДЗ из уроков 05–07 — сначала завершите его.

Часть 1 — из разбора лекции: модели и связи

Задачи 1–5 взяты из разбора домашнего задания на лекции Summary session 2.

1

Задача 1. Движок SQLite в памяти

Создайте экземпляр движка для подключения к SQLite базе данных в памяти.

from sqlalchemy import create_engine
# ваш код
2

Задача 2. Сессия

Создайте сессию для взаимодействия с базой данных, используя созданный движок.

3

Задача 3. Модель Product

Определите модель продукта Product со следующими колонками:

  • id: числовой идентификатор (первичный ключ)
  • name: строка (макс. 100 символов)
  • price: числовое значение с фиксированной точностью (10, 2)
  • in_stock: логическое значение
4

Задача 4. Модель Category

Определите модель категории Category:

  • id: числовой идентификатор
  • name: строка (макс. 100 символов)
  • description: строка (макс. 255 символов)
5

Задача 5. Связь Product — Category

Установите связь между таблицами Product и Category через колонку category_id. Настройте двунаправленное отношение через relationship().

Часть 2 — расширенное задание: CRUD и запросы

6

Задание 1. Наполнение данными

Добавьте в базу:

Категории:

  • «Электроника», описание: «Гаджеты и устройства.»
  • «Книги», описание: «Печатные книги и электронные книги.»
  • «Одежда», описание: «Одежда для мужчин и женщин.»

Продукты:

  • «Смартфон», цена 299.99, в наличии: True, Электроника
  • «Ноутбук», цена 499.99, в наличии: True, Электроника
  • «Научно-фантастический роман», цена 15.99, в наличии: True, Книги
  • «Джинсы», цена 40.50, в наличии: False, Одежда
  • «Футболка», цена 20.00, в наличии: True, Одежда
7

Задание 2. Чтение данных

Извлеките все записи из таблицы categories. Для каждой категории выведите все связанные продукты с их названиями и ценами.

8

Задание 3. Обновление данных

Найдите первый продукт с названием «Смартфон». Замените его цену на 349.99.

9

Задание 4. Агрегация и группировка

Подсчитайте общее количество продуктов в каждой категории с помощью агрегирующих функций и группировки.

10

Задание 5. Группировка с фильтрацией

Отфильтруйте и выведите только те категории, в которых более одного продукта.

Подготовка окружения

A

Создать виртуальное окружение и установить SQLAlchemy

# PowerShell
python -m venv venv
venv\Scripts\activate
pip install sqlalchemy

# Проверить установку
python -c "import sqlalchemy; print(sqlalchemy.__version__)"
B

Создать файл проекта

# Рекомендуемая структура
sqlalchemy-hw/
  main.py         # весь код задания
  venv/

Полное решение

Показать решение (Задачи 1–5)
from decimal import Decimal
from sqlalchemy import Boolean, ForeignKey, Numeric, String, create_engine
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship, Session

engine = create_engine('sqlite:///:memory:')

class Base(DeclarativeBase):
    pass

class Category(Base):
    __tablename__ = 'categories'
    id: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str] = mapped_column(String(100))
    description: Mapped[str | None] = mapped_column(String(255))
    products: Mapped[list["Product"]] = relationship(back_populates="category")

class Product(Base):
    __tablename__ = 'products'
    id: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str] = mapped_column(String(100))
    price: Mapped[Decimal] = mapped_column(Numeric(10, 2))
    in_stock: Mapped[bool] = mapped_column(Boolean)
    category_id: Mapped[int] = mapped_column(ForeignKey('categories.id'))
    category: Mapped["Category"] = relationship(back_populates="products")

Base.metadata.create_all(engine)
Показать решение (Задания 1–5)
from sqlalchemy import func, select

with Session(engine) as session:
    categories = [
        Category(name="Электроника", description="Гаджеты и устройства."),
        Category(name="Книги", description="Печатные книги и электронные книги."),
        Category(name="Одежда", description="Одежда для мужчин и женщин."),
    ]
    products = [
        Product(name="Смартфон", price=299.99, in_stock=True, category=categories[0]),
        Product(name="Ноутбук", price=499.99, in_stock=True, category=categories[0]),
        Product(name="Научно-фантастический роман", price=15.99, in_stock=True, category=categories[1]),
        Product(name="Джинсы", price=40.50, in_stock=False, category=categories[2]),
        Product(name="Футболка", price=20.00, in_stock=True, category=categories[2]),
    ]
    session.add_all(categories + products)
    session.commit()

    for cat in session.scalars(select(Category)).all():
        print(f"Категория: {cat.name}, Описание: {cat.description}")
        for p in cat.products:
            print(f"    Продукт: {p.name}, Цена: {p.price}, В наличии: {p.in_stock}")

    product = session.scalars(
        select(Product).where(Product.name == "Смартфон")
    ).first()
    if product:
        product.price = 349.99
        session.commit()

    totals = session.execute(
        select(Category.name, func.count(Product.id))
        .join(Product)
        .group_by(Category.name)
    ).all()
    print("Количество продуктов по категориям:", totals)

    multi = session.execute(
        select(Category.name)
        .join(Product)
        .group_by(Category.name)
        .having(func.count(Product.id) > 1)
    ).all()
    print("Категории с 2+ продуктами:", multi)

Проверка в VS Code

C

Запуск через терминал

python main.py

Ожидаемый вывод: список категорий с продуктами, затем статистика.

D

Отладка через F5 (launch.json)

Создайте .vscode/launch.json:

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "SQLAlchemy HW",
      "type": "debugpy",
      "request": "launch",
      "program": "${workspaceFolder}/main.py",
      "console": "integratedTerminal"
    }
  ]
}

Поставьте точку останова на строке session.commit() и запустите через F5. Проверьте состояние объекта в инспекторе переменных.

Связь с теорией

Критерии выполнения