Python: Веб-разработка (Flask)
2026-02-26 17:16 Diff

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

Теперь мы привыкли к фреймворку и понимаем принципы создания приложений на нем, поэтому можно начинать работу с реальной базой данных.

Чтобы начать хранить и извлекать данные из базы, нам нужно выполнить несколько действий:

  • Установить зависимости, необходимые для работы с базой данных
  • Настроить подключение к базе данных и дать к нему доступ из приложения
  • Создать начальную структуру базы данных с нужными таблицами
  • Переписать методы репозиториев так, чтобы они работали с данными через базу

В этом уроке мы проделаем все эти шаги на примере создания части CRUD для сущности Car с полями manufacturer (марка) и model (модель).

Устанавливаем зависимости

Мы будем использовать базу данных PostgreSQL. Чтобы начать работать, вам потребуется установить библиотеку psycopg. Более детальную работу с psycopg мы будем рассматривать дальше, но пока вы можете изучить нашу статью.

Настраиваем подключение

Рассмотрим такой пример

В примере выше мы создаем соединение с базой данных. Соединение потребуется нам при создании репозитория, так как вся работа с базой будет сосредоточена там.

Строим начальную структуру базы данных

В нашем случае база данных создается при старте приложения, поэтому ее инициализацию мы будем делать там же, во время старта. Для этого создадим файл с нужной схемой данных:

  1. Добавляем файл init.sql:

  2. Загружаем схему в базу. Postgres позволяет подключиться к удаленной базе указав ссылку на нее после флага -d.

Для сборки приложения мы можем написать баш-скрипт build.sh вида:

Дальше сделаем скрипт исполняемым (chmod +x ./build.sh) и добавим такую команду в Makefile проекта:

Теперь мы можем указать эту команду на любом сервисе как команду сборки. Также мы отделяем сборку от кода, что дает больше свободы в конфигурации, и следует принципам 12 факторов.

Создаем репозиторий CarRepository

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

Принцип создания всех методов для работы с базой данных одинаковый:

  • Описываем шаблон запроса
  • Формируем стейтмент
  • Делаем подстановки
  • Выполняем запрос
  • Собираем результат
  • Возвращаем ответ

Рассматриваем примеры операций

Структура контроллеров не меняется, несмотря на все изменения, которые мы сделали. Как видно на примере ниже, правильная организация абстракций и разделение по слоям приводят к тому, что изменение внутренностей не оказывает особого влияния на строение приложения. Контроллеры работают с репозиторием через его методы и ничего не знают про его внутреннюю реализацию:

Также в примере выше мы добавили фильтрацию в GET-форме по маршруту /cars. В реальных приложениях операции выборки, фильтрации, агрегации осуществляются внутри базы с помощью запросов. Современные базы данных выполняют такие операции гораздо быстрее и эффективнее, чем обработка средствами языка.