flask
flaskЛекцияPython/Flask

Урок 5: Базы данных, SQLite и ORM (Flask-SQLAlchemy)

👀 Загрузка...

Проблема: У нашего сайта амнезия

Давайте вспомним, что мы делали раньше. Мы создавали формы, списки друзей, калькуляторы. Но у всех наших программ была одна критическая проблема.

Стоило нам остановить сервер (нажать красный квадрат в PyCharm) или перезагрузить компьютер — и все данные исчезали. Списки становились пустыми, зарегистрированные пользователи пропадали.

Почему так происходит?

Python хранит переменные в RAM (Оперативной памяти). Это "память золотой рыбки" — она работает быстро, но стирается при выключении питания.

Цель урока: Подарить сайту долговременную память. Подключить Базу Данных.


Часть 1: Что такое База Данных и SQLite?

База Данных (БД) — это надежное хранилище информации. В отличие от переменных Python, база данных живет на Жестком диске (HDD/SSD). Ей не страшно выключение компьютера.

В мире существуют огромные базы данных (PostgreSQL, MySQL), которые используют банки и соцсети. Но для обучения и небольших проектов идеален SQLite.

Преимущества SQLite:

  1. Это просто файл. Вся база данных хранится в одном файле (например, blog.db) внутри папки вашего проекта.
  2. Без установки. Не нужно скачивать сложные серверные программы. Поддержка SQLite встроена в Python.
  3. Переносимость. Вы можете скинуть файл 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 %}, чтобы нарисовать их на экране.


Итоги и Домашнее задание

Резюме:

  1. RAM vs Disk: Переменные стираются, База Данных помнит всё.
  2. SQLite: База данных в одном файле.
  3. ORM (SQLAlchemy): Позволяет управлять базой через Python-код.
  4. Session & Commit: Механизм надежного сохранения ("Корзина" и "Оплата").

Домашнее задание: Личный Дневник

Создайте веб-приложение для ведения дневника.

  1. Создайте модель Entry (Запись) с полями: id, title (Заголовок), content (Текст), date (Дата - по желанию).
  2. Сделайте форму на главной странице для добавления мыслей.
  3. Ниже выведите список всех прошлых записей.
  4. Убедитесь, что после перезагрузки компьютера записи не пропадают.

Проверь себя!

Почему данные, сохраненные в обычных переменных Python, исчезают при перезапуске сервера?

Какой шаг в процессе записи данных через SQLAlchemy является самым важным, так как именно он физически сохраняет информацию на жестком диске?