Python: Веб-разработка (Flask)
Теория: Работа с базой данных в Flask
Репозитории, которыми мы пользовались в уроках этого курса, хранят свои данные в сессии. Это было удобно для того, чтобы не отвлекаться на взаимодействие с базой и сфокусироваться на особенностях работы веба.
Теперь мы привыкли к фреймворку и понимаем принципы создания приложений на нем, поэтому можно начинать работу с реальной базой данных.
Чтобы начать хранить и извлекать данные из базы, нам нужно выполнить несколько действий:
- Установить зависимости, необходимые для работы с базой данных
- Настроить подключение к базе данных и дать к нему доступ из приложения
- Создать начальную структуру базы данных с нужными таблицами
- Переписать методы репозиториев так, чтобы они работали с данными через базу
В этом уроке мы проделаем все эти шаги на примере создания части CRUD для сущности Car с полями manufacturer (марка) и model (модель).
Устанавливаем зависимости
Мы будем использовать базу данных PostgreSQL. Чтобы начать работать, вам потребуется установить библиотеку psycopg. Более детальную работу с psycopg мы будем рассматривать дальше, но пока вы можете изучить нашу статью.
Настраиваем подключение
Рассмотрим такой пример
В примере выше мы создаем соединение с базой данных. Соединение потребуется нам при создании репозитория, так как вся работа с базой будет сосредоточена там.
Строим начальную структуру базы данных
В нашем случае база данных создается при старте приложения, поэтому ее инициализацию мы будем делать там же, во время старта. Для этого создадим файл с нужной схемой данных:
-
Добавляем файл init.sql:
-
Загружаем схему в базу. Postgres позволяет подключиться к удаленной базе указав ссылку на нее после флага
-d.
Для сборки приложения мы можем написать баш-скрипт build.sh вида:
Дальше сделаем скрипт исполняемым (chmod +x ./build.sh) и добавим такую команду в Makefile проекта:
Теперь мы можем указать эту команду на любом сервисе как команду сборки. Также мы отделяем сборку от кода, что дает больше свободы в конфигурации, и следует принципам 12 факторов.
Создаем репозиторий CarRepository
В репозитории нам понадобится соединение с базой данных, так как вся работа с базой будет сосредоточена тут. Соединение будет передаваться в конструктор при создании объекта репозитория.
Принцип создания всех методов для работы с базой данных одинаковый:
- Описываем шаблон запроса
- Формируем стейтмент
- Делаем подстановки
- Выполняем запрос
- Собираем результат
- Возвращаем ответ
Рассматриваем примеры операций
Структура контроллеров не меняется, несмотря на все изменения, которые мы сделали. Как видно на примере ниже, правильная организация абстракций и разделение по слоям приводят к тому, что изменение внутренностей не оказывает особого влияния на строение приложения. Контроллеры работают с репозиторием через его методы и ничего не знают про его внутреннюю реализацию:
Также в примере выше мы добавили фильтрацию в GET-форме по маршруту /cars. В реальных приложениях операции выборки, фильтрации, агрегации осуществляются внутри базы с помощью запросов. Современные базы данных выполняют такие операции гораздо быстрее и эффективнее, чем обработка средствами языка.

