Урок 85. Практикум 21

📁 Блок: Практикум / Базы данных ⏱️ Время изучения: ~120 мин 🎯 Сложность: Средняя
#if #not #values #from #int #decimal #with #as #open #strip #split #reader #import #print #for #in #try #except #or #float #while #input #elif #break #else #len #def #continue #and #return #insert #is #pass #update

⚡ Кратко: суть темы

Практикум 21 — начинаем собирать консольный онлайн-магазин книг на Python с базой данных MySQL. В этой части создаём базу bookstore, таблицы books и users, консольное меню, загрузку книг из CSV-файла, регистрацию и вход пользователя.

  • Создаём БД и таблицы через CREATE DATABASE/TABLE и проверяем результат через SHOW.
  • Используем pymysql.connect(**config) и контекстные менеджеры with для работы с соединением и курсором.
  • Загружаем книги из CSV: если книга уже есть — обновляем количество (UPDATE), иначе — добавляем (INSERT).
  • Регистрируем пользователя с проверкой уникальности логина и входим в аккаунт через параметризованный SELECT.
  • Параметризованные запросы (%s, (...)) защищают от SQL-инъекций — никогда не подставляйте пользовательский ввод f-строкой в SQL.

Минимальный пример:

import pymysql

config = {"host": "localhost", "user": "root", "password": "secret"}
with pymysql.connect(**config) as connection:
    with connection.cursor() as cursor:
        cursor.execute("CREATE DATABASE IF NOT EXISTS bookstore")
        cursor.execute("SHOW DATABASES")
        if "bookstore" in [row[0] for row in cursor]:
            print("Database 'bookstore' created or already exists.")

Топ-3 ошибки:

  1. Вставка переменных в SQL через f-строки — открывает дверь SQL-инъекциям.
  2. Забытый connection.commit() — изменения не сохраняются в БД.
  3. Путаница индексов в fetchone(): забывают, что результат — кортеж, и пишут result[0] без проверки на None.

📖 О чём этот урок

Этот урок — первая часть большого практического проекта: онлайн-магазин книг. Мы пошагово строим консольное приложение, которое работает с реляционной базой данных MySQL через библиотеку PyMySQL. В дальнейшем проект дополнят MongoDB для хранения поисковых запросов, покупки книг, фиксация заказов и разделение на модули.

В части 1 мы заложим фундамент: создадим базу данных bookstore, таблицы для книг и пользователей, научимся загружать книги из текстового файла, регистрировать клиентов и входить в аккаунт. Это типичный сценарий для учебных и небольших реальных приложений, где данные нужно хранить структурированно и надёжно.

Что изучим

  • Создание базы данных и таблиц через SQL и PyMySQL.
  • Проверку результата команд SHOW DATABASES и SHOW TABLES.
  • Чтение CSV-подобных текстовых файлов и загрузку данных в БД.
  • Параметризованные запросы INSERT, SELECT и UPDATE.
  • Регистрацию пользователя с проверкой уникальности логина.
  • Авторизацию и запуск подменю для вошедшего клиента.
  • Современные практики: guard clauses, ранний возврат, if __name__ == "__main__".

📚 Что повторить перед изучением

🎯 Что изучать дальше