📝 Практические задания

⚡ Задания в двух словах

  • Задание 1 — создать базу данных bookstore и проверить её наличие.
  • Задание 2 — создать таблицы books и users и вывести их список.
  • Задание 3 — написать функцию загрузки книг из CSV с обновлением существующих записей.
  • Задание 4 — добавить регистрацию пользователя с проверкой уникальности логина.
  • Задание 5 — добавить вход в аккаунт и подменю клиента.
  • Задание 6 (★) — вынести настройки подключения в переменные окружения.

🏋️ Раздел тренировки

В этом разделе вы пошагово соберёте первую часть онлайн-магазина книг: от создания базы данных до рабочего меню с регистрацией и входом.

Цель тренировки: научиться самостоятельно проектировать таблицы MySQL, писать параметризованные запросы через PyMySQL и строить консольное меню.

📂 Подготовка проекта

  1. Создайте папку урока, например python-fundamentals-practice/lesson-85/.
  2. Установите PyMySQL: pip install pymysql.
  3. Создайте файл books.csv с несколькими строками в формате title,author,price,stock.

Задание 1. Создание базы данных

Условие: напишите скрипт, который подключается к MySQL и создаёт базу данных bookstore. После создания выполните проверку через SHOW DATABASES и выведите сообщение Database 'bookstore' created or already exists., если база есть в списке.

Что должно получиться: в терминале появляется подтверждение, что база данных создана или уже существует.

Подсказка: используйте CREATE DATABASE IF NOT EXISTS, чтобы скрипт не падал при повторном запуске.

Задание 2. Создание таблиц

Условие: расширьте предыдущий скрипт. После создания базы создайте в ней таблицы books и users со следующими столбцами:

  • books: id, title, author, price, stock.
  • users: id, username, password, balance.

После создания таблиц выведите их список в формате:

Tables in 'bookstore':
- books
- users

Подсказка: не забудьте выполнить USE bookstore перед созданием таблиц.

Задание 3. Загрузка книг из файла

Условие: напишите функцию load_books_from_file(filename, connection), которая:

  • читает файл построчно;
  • разбивает каждую строку по запятой на 4 части;
  • если книга с таким title и author уже есть — увеличивает stock;
  • если такой книги нет — добавляет новую запись;
  • по завершении выводит количество обработанных строк, например 2 books loaded.

Что должно получиться: после запуска функции в таблице books появляются книги из файла, повторный запуск увеличивает количество существующих книг.

Подсказка: используйте параметризованные запросы SELECT ... WHERE title = %s AND author = %s.

Задание 4. Регистрация клиента

Условие: напишите функцию register_user(connection), которая запрашивает у пользователя логин, пароль и начальный баланс. Если логин уже существует — выводит Username already exists. и завершает работу. Иначе — добавляет пользователя и выводит Registration successful.

Что должно получиться: программа не позволяет зарегистрировать двух пользователей с одинаковым логином.

Подсказка: проверьте баланс на корректность через try/except ValueError.

Задание 5. Вход в аккаунт и подменю

Условие: напишите функцию try_login(connection), которая возвращает user_id при успешном вводе логина и пароля, иначе None. После успешного входа запускайте подменю user_menu(connection, user_id) с пунктами «Показать книги» и «Выйти».

Что должно получиться: после входа пользователь попадает в своё меню, после выхода из него — обратно в главное.

Подсказка: храните user_id в переменной и передавайте его в подменю.

Задание 6 (★ продвинутое). Поиск книг по названию

Условие: добавьте в подменю пользователя пункт «Найти книгу». Пользователь вводит ключевое слово, программа выводит все книги, в названии которых оно встречается. Используйте оператор LIKE и параметризованный запрос.

Что должно получиться: при вводе Python выводятся книги с названиями вроде Python Crash Course и Learning Python.

Подсказка: шаблон для LIKE формируйте так: pattern = f"%{keyword}%", а в SQL используйте title LIKE %s.

Задание 7 (★ продвинутое). Переменные окружения

Условие: вынесите параметры подключения к базе данных в переменные окружения и загрузите их через os.getenv или библиотеку python-dotenv.

Что должно получиться: в коде не остаётся логинов и паролей; для запуска нужен файл .env или заданные переменные окружения.

Подсказка: создайте файл .env и добавьте его в .gitignore.

Проверка понимания

Выберите один вариант ответа. После клика правильный ответ подсветится зелёным.

Вопрос 1

Что важнее всего в практическом задании?

Вопрос 2

Как безопаснее двигаться в практикуме?

Вопрос 3

Что делать, если решение не совпадает с ожидаемым результатом?

Вопрос 4

Какой стиль имён переменных обычно рекомендует PEP 8?

Вопрос 5

Зачем использовать f-strings в современном Python?

Вопрос 6

Когда полезен ранний возврат из функции?