🏠 Домашнее задание — Summary session 2
Это не LMS-задание, а самостоятельная закрепляющая практика. В Summary session 2 новых задач в LMS не выдавалось — урок посвящён повторению. Используйте это задание для проверки знаний блока SQLAlchemy. Если у вас есть незакрытое ДЗ из уроков 05–07 — сначала завершите его.
Часть 1 — из разбора лекции: модели и связи
Задачи 1–5 взяты из разбора домашнего задания на лекции Summary session 2.
Задача 1. Движок SQLite в памяти
Создайте экземпляр движка для подключения к SQLite базе данных в памяти.
from sqlalchemy import create_engine
# ваш код
Задача 2. Сессия
Создайте сессию для взаимодействия с базой данных, используя созданный движок.
Задача 3. Модель Product
Определите модель продукта Product со следующими колонками:
id: числовой идентификатор (первичный ключ)name: строка (макс. 100 символов)price: числовое значение с фиксированной точностью (10, 2)in_stock: логическое значение
Задача 4. Модель Category
Определите модель категории Category:
id: числовой идентификаторname: строка (макс. 100 символов)description: строка (макс. 255 символов)
Задача 5. Связь Product — Category
Установите связь между таблицами Product и Category через колонку category_id. Настройте двунаправленное отношение через relationship().
Часть 2 — расширенное задание: CRUD и запросы
Задание 1. Наполнение данными
Добавьте в базу:
Категории:
- «Электроника», описание: «Гаджеты и устройства.»
- «Книги», описание: «Печатные книги и электронные книги.»
- «Одежда», описание: «Одежда для мужчин и женщин.»
Продукты:
- «Смартфон», цена 299.99, в наличии: True, Электроника
- «Ноутбук», цена 499.99, в наличии: True, Электроника
- «Научно-фантастический роман», цена 15.99, в наличии: True, Книги
- «Джинсы», цена 40.50, в наличии: False, Одежда
- «Футболка», цена 20.00, в наличии: True, Одежда
Задание 2. Чтение данных
Извлеките все записи из таблицы categories. Для каждой категории выведите все связанные продукты с их названиями и ценами.
Задание 3. Обновление данных
Найдите первый продукт с названием «Смартфон». Замените его цену на 349.99.
Задание 4. Агрегация и группировка
Подсчитайте общее количество продуктов в каждой категории с помощью агрегирующих функций и группировки.
Задание 5. Группировка с фильтрацией
Отфильтруйте и выведите только те категории, в которых более одного продукта.
Подготовка окружения
Создать виртуальное окружение и установить SQLAlchemy
# PowerShell
python -m venv venv
venv\Scripts\activate
pip install sqlalchemy
# Проверить установку
python -c "import sqlalchemy; print(sqlalchemy.__version__)"
Создать файл проекта
# Рекомендуемая структура
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
Запуск через терминал
python main.py
Ожидаемый вывод: список категорий с продуктами, затем статистика.
Отладка через 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. Проверьте состояние объекта в инспекторе переменных.
Связь с теорией
- Модели и связи: theory.html → Модели, → Связи
- CRUD операции: theory.html → CRUD
- Агрегации: theory.html → Запросы
- Примеры полного кода: examples.html
Критерии выполнения
- Движок, сессия и обе модели созданы корректно
- Связь Product — Category настроена двунаправленно
- Все 5 продуктов добавлены и привязаны к категориям
- Чтение выводит список категорий с продуктами
- Цена смартфона обновлена до 349.99
- Агрегация считает количество продуктов по категориям
- having() фильтрует категории с более чем одним продуктом
- Код в ветке
lesson/08-summary-session-2