# Создание надежной архитектуры базы данных на Flask и SQLAlchemy

⚡ **Зачем читать этот экстракт:**
⚡ Изучите ORM для управления данными; ⚡ Узнайте, как связывать таблицы (один-ко-многим); ⚡ Освойте работу с SQLite через Python.

> 🎤 **Corey Schafer** — Corey Schafer — известный создатель обучающих видео по Python, специализирующийся на глубоком разборе библиотек Flask и Django для разработчиков всех уровней.

## 🗺 Карта навыков

| # | Навык | Время | Результат |
|---|-------|-------|-----------|
| 1 | Интеграция Flask-SQLAlchemy | 5 мин | Настроенное соединение с базой данных |
| 2 | Проектирование моделей данных | 15 мин | Архитектура таблиц приложения |
| 3 | Написание запросов к БД | 10 мин | Умение извлекать и фильтровать данные |
| 4 | Работа с внешними ключами | 10 мин | Связанные данные между пользователями и постами |


*Развертывание ORM SQLAlchemy для управления данными в веб-приложении на Flask. Практикум для Python-разработчиков среднего уровня за 30 минут.*


## Ключевые тезисы

### Установите Flask-SQLAlchemy
Используйте пакет `flask-sqlalchemy` вместо стандартного `sqlalchemy`. Это расширение предоставляет удобные настройки по умолчанию, специфичные для Flask, упрощая интеграцию базы данных в ваш проект.

### Сконфигурируйте URI базы данных
Укажите путь к SQLite базе данных в конфигурации приложения. Использование относительного пути с тремя слэшами создает файл базы данных непосредственно в директории проекта, что идеально для этапа разработки.

### Создайте структуру данных через модели
Определите таблицы базы данных как Python-классы, наследуемые от `db.Model`. Каждое поле в классе превращается в колонку таблицы, что позволяет взаимодействовать с SQL через интуитивный объектно-ориентированный интерфейс.

### Реализуйте отношения «один-ко-многим»
Свяжите таблицы `User` и `Post` с помощью `db.relationship` и внешнего ключа. Это позволяет легко получать доступ ко всем постам пользователя через атрибут объекта, не прибегая к сложным SQL-запросам вручную.

### Используйте UTC для временных меток
Всегда применяйте `datetime.utcnow` (без вызова функции) в качестве значения по умолчанию для временных колонок. Это обеспечивает согласованность данных независимо от часового пояса сервера.

### Создайте таблицы командой `create_all`
Инициируйте создание физических таблиц в базе данных с помощью метода `db.create_all()` в интерактивной оболочке Python. Это переносит вашу объектную схему в реальный файл базы данных.

### Выполняйте операции CRUD через сессии
Добавляйте записи в базу данных с помощью `db.session.add()` и фиксируйте изменения командой `db.session.commit()`. Такой подход гарантирует атомарность и целостность транзакций.

### Оптимизируйте выборку данных методами запросов
Используйте методы `.query.all()`, `.query.first()` или `.filter_by()` для извлечения данных. Это превращает записи базы данных обратно в Python-объекты, готовые к дальнейшему использованию в коде.


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

### Настройка окружения и модели базы данных
⏱ 20 мин | 🎯 Цель: Подключить SQLAlchemy и создать схему данных. | Шаги: 1. Установите flask-sqlalchemy через pip. 2. Добавьте конфигурацию `SQLALCHEMY_DATABASE_URI` в файл проекта. 3. Опишите классы User и Post с нужными типами данных. | ✅ Результат: Файл `flask_blog.py` с настроенными моделями.

### Создание и наполнение базы данных
⏱ 15 мин | 🎯 Цель: Инициализировать БД и внести тестовые данные. | Шаги: 1. Запустите консоль Python. 2. Импортируйте экземпляр `db`. 3. Выполните `db.create_all()`. 4. Создайте двух пользователей и три поста, сохранив их через `commit`. | ✅ Результат: Файл `site.db` в директории проекта.

### Тестирование связей и фильтрации
⏱ 10 мин | 🎯 Цель: Освоить синтаксис запросов. | Шаги: 1. Сделайте запрос `User.query.filter_by(...)`. 2. Получите посты конкретного пользователя через атрибут `user.posts`. 3. Проверьте работу обратной ссылки `post.author`. | ✅ Результат: Консольные логи с выведенными данными пользователей и их постов.


## Цитаты

> ORM позволяет нам взаимодействовать с базой данных в объектно-ориентированном стиле. Самое удобное, что можно сменить тип базы данных, не меняя основной код приложения.

> Мы используем три слэша для указания относительного пути в SQLite. Это означает, что файл базы данных будет создан прямо в директории вашего проекта рядом с Python-модулем.

> Relationship — это не колонка в таблице. Это способ выполнения дополнительного SQL-запроса в фоне, чтобы удобно связать объекты в коде.

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