- Полное руководство по SQLAlchemy
- Зачем использовать SQLAlchemy
- Так что использовать: Core или ORM?
- Кто использует SQLAlchemy
- Уроки по SQLAlchemy
- Python фреймворк для базы данных
- Переменные в маршрутах
- GET- и POST-запросы
- Шаблонизатор Jinja2
- Работа с базой данных
- Практика
- Задание 1
- Задание 5
- Задание 6
- Задание 7
- Задание 8
- Задание 9
- Задание 10
- Подведем итоги
- Материалы по теме
Полное руководство по SQLAlchemy
SQLAclhemy — это де-факто фреймворк для работы с реляционными базами данных в Python. Он был создан Майком Байером в 2005 году. SQLAlchemy позволяет работать с базами данных MySQL, MS-SQL, PostgreSQL, Oracle, SQLite и другими.
Зачем использовать SQLAlchemy
Самая важная особенность SQLAlchemy — это ее ORM. ORM или Object Relational Mapper (объектно-реляционное отображение) позволяет работать с базой данных с помощью объектно-ориентированного кода, не используя SQL-запросы. Еще одна особенность SQLAlchemy — код приложения будет оставаться тем же вне зависимости от используемой базы данных. Это позволяет с легкостью мигрировать с одной базы данных на другую, не переписывая код.
У SQLAlchemy есть компонент, который называется SQLAlchemy Core. Это абстракция над традиционным SQL. Он предоставляет SQL Expression Language, позволяющий генерировать SQL-инструкции с помощью конструкций Python.
В отличие от ORM, который сосредоточен на моделях и объектах, Core фокусируется на таблицах, колонках, индексах и так далее (по аналогии с обычным SQL). SQL Expression Language очень похож на SQL, однако он стандартизирован, поэтому его можно использовать в разных базах данных. SQLAlchemy ORM и Core можно использовать независимо друг от друга. Под капотом SQLAlchemy ORM использует Core.
Так что использовать: Core или ORM?
Смысл ORM — упрощение процесса работы с базой данных. В процессе добавляется некая сложность, однако она незаметна, если работать с не очень большими объемами данных. Для большинства проектов ORM будет достаточно, однако там, где имеется много данных, стоит работать с чистым SQL.
Кто использует SQLAlchemy
- Hulu
- Fedora Project
- Dropbox
- OpenStack
- и многие другие.
Уроки по SQLAlchemy
Чтобы разобраться с руководством, нужно иметь базовые знания в Python и SQL.
Python фреймворк для базы данных
Перейдите в только что созданную директорию:
Flask по умолчанию использует порт 5000. При желании его можно изменить на более привычный 8000:
Переменные в маршрутах
В URL можно передавать различные значения. Запустите этот код и перейдите по адресу, например, http://localhost:5000/user/EvilAdmin
А так можно передать в маршруте целое число:
GET- и POST-запросы
GET и POST – это HTTP-запросы, которые используются для отправки данных между клиентом и сервером.
GET-запрос применяют для получения данных от сервера. При выполнении GET-запроса клиент отправляет запрос на сервер, а сервер возвращает запрошенную информацию в ответ. GET-запросы могут содержать параметры в URL-адресе, которые используются для передачи дополнительных данных.
POST-запрос используют для отправки данных на сервер. При выполнении POST-запроса клиент отправляет данные на сервер, а сервер их обрабатывает. POST-запросы обычно применяют для отправки форм, с данными из которых нужно что-то сделать на бэкенде.
Рассмотрим простейший пример обработки формы авторизации. Базы данных для хранения учетных записей у нас пока нет, поэтому в приведенном ниже коде мы пропустим всю функциональность для проверки корректности логина и пароля (мы рассмотрим этот вопрос позже, в одном из заданий):
Шаблонизатор Jinja2
Шаблоны в Flask используются для динамического формирования веб-страниц. Шаблоны представляют собой HTML страницы, в которые можно передавать любые данные с бэкенда. К шаблонам можно подключать любые CSS -фреймворки типа Bootstrap и Tailwind , и любые JS -скрипты.
Поведением шаблонов управляет шаблонизатор Jinja 2 – он предоставляет функциональность для создания условий, циклов, макросов, наследования и блоков. Главные преимущества шаблонизатора:
- Может проводить различные операции с контентом самостоятельно, не обращаясь к бэкенду.
- Обеспечивает наследование дизайна и стилей от базового шаблона.
Наследование работает так:
- Базовый шаблон, который обычно называется base.html, содержит общую разметку для сайта.
- В base.html подключаются локальные и CDN-фреймворки (CSS, JS), задаются фоновые изображения и фавикон.
- Дочерние шаблоны наследуют этот базовый шаблон и дополняют его своим собственным контентом.
Продемонстрируем наследование на примере. Сохраните в папке templates два файла. Это содержимое файла base . html – в нем подключается CSS -фреймворк Bootstrap , кастомные стили custom . css из статической папки static, иконки Font Awesome :
Работа с базой данных
Для работы с базами данных в Flask удобно использовать ORM SQLAlchemy. Как уже упоминалось в предыдущей главе о SQLite, ORM играет роль своеобразной прослойки между приложением и СУБД SQLite , и позволяет работать с базами без использования языка SQL . Надо заметить, что работать с базами данных в SQLAlchemy немного сложнее, чем в Django ORM , но гораздо проще, чем в чистом Python .
Начнем с установки SQLAlchemy в виртуальное окружение:
Практика
Задание 1
Напишите Flask -приложение, которое выводит в шаблон index . html приветствие для пользователя. Приветствие зависит от времени суток:
- С 6:00 до 12:00 – «Доброе утро»
- С 12:00 до 18:00 – «Добрый день»
- С 18:00 до 24:00 – «Добрый вечер»
- С 00:00 до 6:00 – «Доброй ночи»
В приложении app . py можно определить только маршрут, вся функциональность по определению уровней доступа находится в шаблоне:
Напишем модель Book и скрипт, который создает и заполняет базу из json-файла. Затем создадим app . py с двумя маршрутами – для вывода всех книг, и для вывода отдельной книги:
Задание 5
Для онлайн-магазина нужно написать модуль, который поможет сотрудникам сделать инвентаризацию. Приложение состоит из базы данных, в которой таблицы связаны сложными отношениями:
- Каждый производитель (Manufacturer) поставляет несколько типов товаров (Category) – ноутбуки, наушники, смартфоны и так далее.
- Одну и ту же категорию товаров могут производить несколько компаний.
- В каждой категории может быть множество товаров (Item).
Нужно реализовать вывод всех товаров по поставщикам и по категориям. Все данные о товарах находятся в файле info.csv.
Файл models . py , описывающий структуру базы данных, выглядит так:
Задание 6
Для супермаркета нужно написать веб-приложение, которое выводит список товаров на складе и позволяет добавлять новые.
Приложение состоит из файлов app.py, create_db.py и models.py. Для добавления новых товаров используется шаблон add . html и маршрут/функция add :
Задание 7
Для ветеринарной клиники нужно написать модуль учета пациентов. В приложении должны быть функции добавления, редактирования и удаления карточек.
Начнем с создания базы данных на основе моделей. Функции add_patient, edit_patient, delete_patient реализованы в приложении app.py. Шаблоны add . html и edit . html обеспечивают добавление и редактирование карточек:
Задание 8
Напишите модуль аутентификации для Flask -приложения. Необходимо реализовать:
- регистрацию;
- проверку учетных данных при входе;
- перенаправление на страницу профиля.
Проект включает в себя файлы app.py, create_db.py и models . py . Кроме того, модуль использует шаблоны:
После регистрации и входа пользователь перенаправляется на страницу своего профиля:
Задание 9
Напишите веб-приложение для хранения заметок. Необходимо реализовать набор CRUD операций – вывод, добавление, редактирование и удаление заметок. При создании базы данных следует учесть, что заметка может относиться только к одной категории, а в категории может быть множество заметок. На главной странице выводятся все заметки, причем текст ограничивается первыми 300 символами. Нажатие на ссылку «Далее» открывает страницу с полным текстом заметки.
База данных для приложения создается с помощью скрипта create _ db . py на основе моделей. CRUD операции описаны в app . py . При нажатии на название категории шаблон и маршрут category выводят все заметки, относящиеся к данной теме.
Задание 10
Напишите Flask приложение для ведения блога. Каждая запись может иметь несколько тегов, но должна относиться к одной категории. Как и в предыдущем задании, нужно реализовать просмотр отдельных записей, добавление, редактирование и удаление постов. При выводе всех записей, а также записей по категориям и тегам посты должны отображаться в порядке убывания даты, т.е. самые новые находятся сверху.
Прежде всего разработаем модели Tag , Category и Post , а затем создадим на их основе базу данных при помощи скрипта.
Приложение использует следующие шаблоны:
CRUD операции реализованы в главном файле приложения app . py . Чтобы самые свежие записи выводились первыми, в models . py мы определили метод newest _ first . При нажатии на ссылку «Читать» выводится полный текст записи:
Подведем итоги
Мы рассмотрели основные приемы разработки простых веб-приложений на основе фреймворка Flask:
- Создание маршрутов и функций представления.
- Получение и обработку данных с фронтенда.
- CRUD операции.
- Основные возможности шаблонизатора Jinja2.
При создании приложений Flask для получения данных с фронтенда обычно используются формы WTF Forms . В этой статье при решении заданий намеренно использовались HTML -формы – так процесс передачи и обработки данных выглядит максимально понятно.
В следующей статье будем изучать NumPy .
- Особенности, сферы применения, установка, онлайн IDE
- Все, что нужно для изучения Python с нуля – книги, сайты, каналы и курсы
- Типы данных: преобразование и базовые операции
- Методы работы со строками
- Методы работы со списками и списковыми включениями
- Методы работы со словарями и генераторами словарей
- Методы работы с кортежами
- Методы работы со множествами
- Особенности цикла for
- Условный цикл while
- Функции с позиционными и именованными аргументами
- Анонимные функции
- Рекурсивные функции
- Функции высшего порядка, замыкания и декораторы
- Методы работы с файлами и файловой системой
- Регулярные выражения
- Основы скрапинга и парсинга
- Основы ООП: инкапсуляция и наследование
- Основы ООП: абстракция и полиморфизм
- Графический интерфейс на Tkinter
- Основы разработки игр на Pygame
- Основы работы с SQLite
- Основы веб-разработки на Flask