Урок 5: Базы данных, SQLite и ORM (Flask-SQLAlchemy)
Проблема: У нашего сайта амнезия
Давайте вспомним, что мы делали раньше. Мы создавали формы, списки друзей, калькуляторы. Но у всех наших программ была одна критическая проблема.
Стоило нам остановить сервер (нажать красный квадрат в PyCharm) или перезагрузить компьютер — и все данные исчезали. Списки становились пустыми, зарегистрированные пользователи пропадали.
Почему так происходит?
Python хранит переменные в RAM (Оперативной памяти). Это "память золотой рыбки" — она работает быстро, но стирается при выключении питания.
Цель урока: Подарить сайту долговременную память. Подключить Базу Данных.
Часть 1: Что такое База Данных и SQLite?
База Данных (БД) — это надежное хранилище информации. В отличие от переменных Python, база данных живет на Жестком диске (HDD/SSD). Ей не страшно выключение компьютера.
В мире существуют огромные базы данных (PostgreSQL, MySQL), которые используют банки и соцсети. Но для обучения и небольших проектов идеален SQLite.
Преимущества SQLite:
- Это просто файл. Вся база данных хранится в одном файле (например,
blog.db) внутри папки вашего проекта. - Без установки. Не нужно скачивать сложные серверные программы. Поддержка SQLite встроена в Python.
- Переносимость. Вы можете скинуть файл
blog.dbдругу, и у него будет та же база данных.
Часть 2: Языковой барьер и ORM
Здесь возникает сложность.
Понимает Классы и Объекты.
Они говорят на разных языках. Чтобы нам не пришлось учить SQL прямо сейчас, мы используем технологию ORM (Object-Relational Mapping). В нашем случае это библиотека Flask-SQLAlchemy.
ORM — это переводчик. Вы говорите на Python: "Создай нового пользователя". ORM переводит это для базы: "INSERT INTO users VALUES...". Это позволяет работать с базой данных так, будто это обычные объекты Python.
Часть 3: Создание Модели (Чертеж таблицы)
Чтобы база данных знала, что хранить, мы должны создать Модель. В Python это обычный класс, который наследуется от db.Model.
class Message(db.Model):
# primary_key=True — это уникальный номер паспорта для записи
id = db.Column(db.Integer, primary_key=True)
# String(50) — короткий текст (имя)
author = db.Column(db.String(50), nullable=False)
# Text — длинный текст (само сообщение)
text = db.Column(db.Text, nullable=False)Когда мы запускаем команду db.create_all(), Flask берет этот класс и создает в файле реальную таблицу с колонками id, author, text.
Часть 4: Запись данных (Аналогия с магазином)
Процесс сохранения данных в БД через SQLAlchemy похож на покупку в интернет-магазине. Он состоит из трех шагов.
(Создание объекта)
msg = Message(author="Alex", text="Привет!")
Сейчас объект просто висит в памяти Python.
Часть 5: Чтение данных (Query)
Как получить наши сообщения обратно, чтобы показать их на сайте?
У нашей модели есть инструмент поиска — .query.
Основные команды:
Message.query.all()— Вернуть список всех записей из таблицы.Message.query.get(5)— Найти запись, у которойidравен 5.Message.query.filter_by(author="Alex").all()— Найти все сообщения от Алекса.
Обычно мы получаем список всех сообщений в app.py и передаем его в шаблон:
return render_template("index.html", all_messages=messages)
А в шаблоне используем цикл {% for msg in all_messages %}, чтобы нарисовать их на экране.
Итоги и Домашнее задание
Резюме:
- RAM vs Disk: Переменные стираются, База Данных помнит всё.
- SQLite: База данных в одном файле.
- ORM (SQLAlchemy): Позволяет управлять базой через Python-код.
- Session & Commit: Механизм надежного сохранения ("Корзина" и "Оплата").
Домашнее задание: Личный Дневник
Создайте веб-приложение для ведения дневника.
- Создайте модель
Entry(Запись) с полями:id,title(Заголовок),content(Текст),date(Дата - по желанию). - Сделайте форму на главной странице для добавления мыслей.
- Ниже выведите список всех прошлых записей.
- Убедитесь, что после перезагрузки компьютера записи не пропадают.