🏠 Домашнее задание

⚡ Суть задания

Создайте базу данных bookstore и таблицы books и users через PyMySQL. Проверьте результат командами SHOW DATABASES и SHOW TABLES. Подготовьте файловую структуру для дальнейшего развития проекта.

Результат: рабочий скрипт init_bookstore.py, который создаёт БД и таблицы, а в терминале выводит список баз и таблиц.

📋 Формулировка задания

Исходное задание из LMS:

Онлайн-магазин книг. Часть 1.

  1. Создайте новую базу данных под названием bookstore. После создания выполните проверку: если база данных успешно создана (или уже существует), выведите сообщение Database 'bookstore' created or already exists.
  2. Расширьте предыдущую программу: после создания базы данных bookstore создайте в ней две таблицы: books — для хранения информации о книгах, и users — для регистрации клиентов. После создания таблиц выведите список всех таблиц в текущей базе.

🔧 Шаг 0. Подготовка окружения

Перед началом работы над любым заданием курса нужно настроить окружение. Эти шаги одинаковы для всех уроков.

📁 Структура репозитория: мы используем один репозиторий для всех практических работ курса. Это удобнее, чем 88 отдельных репозиториев: общий .gitignore, единая история, легко переключаться между уроками.
1

Создайте (или откройте) рабочую папку

В VS Code нажмите Ctrl+K Ctrl+O → выберите или создайте папку python-fundamentals-practice. Это будет корень вашего учебного репозитория.

# Или в терминале VS Code (Ctrl + `):
mkdir python-fundamentals-practice
cd python-fundamentals-practice
2

Инициализируйте Git-репозиторий (один раз)

Если папка ещё не является git-репозиторием:

git init

# Создайте базовые файлы
echo "# Python Fundamentals — Практические работы" > README.md
echo "venv/" > .gitignore
echo "__pycache__/" >> .gitignore
echo "*.pyc" >> .gitignore
echo ".env" >> .gitignore

git add README.md .gitignore
git commit -m "init: базовая структура репозитория"
3

Создайте папку для текущего урока

# Структура: lesson-XX/
mkdir -p lesson-85
cd lesson-85
4

Создайте виртуальное окружение (venv)

# Windows (PowerShell / CMD)
python -m venv venv
venv\Scripts\activate

# Mac / Linux
python3 -m venv venv
source venv/bin/activate

После активации в начале строки терминала появится (venv). Все дальнейшие команды выполняйте внутри venv.

5

Установите зависимости для урока

pip install pymysql python-dotenv

# Сохраните зависимости
pip freeze > requirements.txt
6

Создайте ветку для задания

# Вернитесь в корень репозитория
cd ../..

# Создайте и переключитесь на ветку
git checkout -b lesson/85-practice-21

# Отправьте ветку на удалённый репозиторий (если настроен)
git push -u origin lesson/85-practice-21

Именование веток: lesson/XX-краткое-название. Это позволяет легко находить нужный урок.

🛠️ Шаги выполнения задания

Теперь, когда окружение готово, приступайте к решению.

1

Шаг 1: создайте файл init_bookstore.py

В папке lesson-85 создайте файл и подключитесь к MySQL через PyMySQL.

import pymysql

config = {
    "host": "ich-edit.edu.itcareerhub.de",
    "user": "ich1",
    "password": "ich1_password_ilovedbs",
}

db_name = "bookstore"
2

Шаг 2: создайте базу данных и проверьте результат

Выполните CREATE DATABASE IF NOT EXISTS bookstore, затем SHOW DATABASES и проверьте, есть ли bookstore в списке.

with pymysql.connect(**config) as connection:
    with connection.cursor() as cursor:
        cursor.execute(f"CREATE DATABASE IF NOT EXISTS {db_name}")
        cursor.execute("SHOW DATABASES")
        databases = [row[0] for row in cursor]

        if db_name in databases:
            print(f"Database '{db_name}' created or already exists.")
        else:
            print("Something went wrong. Database not found.")
3

Шаг 3: создайте таблицы books и users

После создания базы переключитесь на неё через USE bookstore и создайте таблицы.

books_query = """
    CREATE TABLE IF NOT EXISTS books (
        id INT AUTO_INCREMENT PRIMARY KEY,
        title VARCHAR(200),
        author VARCHAR(100),
        price DECIMAL(10, 2),
        stock INT CHECK (stock >= 0)
    )
"""

users_query = """
    CREATE TABLE IF NOT EXISTS users (
        id INT AUTO_INCREMENT PRIMARY KEY,
        username VARCHAR(100),
        password VARCHAR(100),
        balance DECIMAL(10, 2) CHECK (balance >= 0)
    )
"""

with pymysql.connect(**config) as connection:
    with connection.cursor() as cursor:
        cursor.execute(f"CREATE DATABASE IF NOT EXISTS {db_name}")
        cursor.execute(f"USE {db_name}")
        cursor.execute(books_query)
        cursor.execute(users_query)

        cursor.execute("SHOW TABLES")
        tables = [row[0] for row in cursor]

        print(f"Tables in '{db_name}':")
        for table in tables:
            print(f"- {table}")

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

Ниже приведено полное решение задания. Совет: попробуйте выполнить самостоятельно, прежде чем смотреть ответ.

import pymysql

config = {
    "host": "ich-edit.edu.itcareerhub.de",
    "user": "ich1",
    "password": "ich1_password_ilovedbs",
}

db_name = "bookstore"

books_query = """
    CREATE TABLE IF NOT EXISTS books (
        id INT AUTO_INCREMENT PRIMARY KEY,
        title VARCHAR(200),
        author VARCHAR(100),
        price DECIMAL(10, 2),
        stock INT CHECK (stock >= 0)
    )
"""

users_query = """
    CREATE TABLE IF NOT EXISTS users (
        id INT AUTO_INCREMENT PRIMARY KEY,
        username VARCHAR(100),
        password VARCHAR(100),
        balance DECIMAL(10, 2) CHECK (balance >= 0)
    )
"""

with pymysql.connect(**config) as connection:
    with connection.cursor() as cursor:
        # Шаг 1 — создать базу данных
        cursor.execute(f"CREATE DATABASE IF NOT EXISTS {db_name}")
        cursor.execute("SHOW DATABASES")
        databases = [row[0] for row in cursor]

        if db_name in databases:
            print(f"Database '{db_name}' created or already exists.")
        else:
            print("Something went wrong. Database not found.")

        # Шаг 2 — создать таблицы
        cursor.execute(f"USE {db_name}")
        cursor.execute(books_query)
        cursor.execute(users_query)

        # Шаг 3 — вывести список таблиц
        cursor.execute("SHOW TABLES")
        tables = [row[0] for row in cursor]

        print(f"Tables in '{db_name}':")
        for table in tables:
            print(f"- {table}")

🧪 Как проверить решение

  1. Активируйте venv: venv\Scripts\activate (Windows) или source venv/bin/activate (Mac/Linux).
  2. Запустите скрипт: python init_bookstore.py.
  3. Проверьте вывод в терминале:
    Database 'bookstore' created or already exists.
    Tables in 'bookstore':
    - books
    - users
  4. Убедитесь, что повторный запуск не вызывает ошибок благодаря IF NOT EXISTS.

🐛 Отладка в VS Code

Если что-то не работает:

  1. Проверьте, что PyMySQL установлен: pip show pymysql.
  2. Убедитесь, что параметры подключения (host, user, password) верны.
  3. Если возникает OperationalError — проверьте доступность сервера MySQL и правильность логина/пароля.
  4. Если таблицы не создаются — убедитесь, что выполнили USE bookstore перед CREATE TABLE.
  5. Используйте точки останова (breakpoints) в VS Code, чтобы пошагово пройти выполнение скрипта.