🏠 Домашнее задание — 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 sqlalchemy import create_engine, sessionmaker
from sqlalchemy.orm import declarative_base, relationship
from sqlalchemy import Column, Integer, String, Numeric, Boolean, ForeignKey

engine = create_engine('sqlite:///:memory:')
Session = sessionmaker(bind=engine)
session = Session()
Base = declarative_base()

class Category(Base):
    __tablename__ = 'categories'
    id = Column(Integer, primary_key=True)
    name = Column(String(100))
    description = Column(String(255))
    products = relationship("Product", back_populates="category")

class Product(Base):
    __tablename__ = 'products'
    id = Column(Integer, primary_key=True)
    name = Column(String(100))
    price = Column(Numeric(10, 2))
    in_stock = Column(Boolean)
    category_id = Column(Integer, ForeignKey('categories.id'))
    category = relationship("Category", back_populates="products")

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

# Задание 1 — наполнение
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()

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

# Задание 3 — обновление
product = session.query(Product).filter_by(name="Смартфон").first()
if product:
    product.price = 349.99
    session.commit()

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

# Задание 5 — having
multi = session.query(
    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. Проверьте состояние объекта в инспекторе переменных.

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

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