HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Репозитории, которыми мы пользовались в уроках этого курса, хранят свои данные в сессии. Это было удобно для того, чтобы не отвлекаться на взаимодействие с базой и сфокусироваться на особенностях работы веба.</p>
1 <p>Репозитории, которыми мы пользовались в уроках этого курса, хранят свои данные в сессии. Это было удобно для того, чтобы не отвлекаться на взаимодействие с базой и сфокусироваться на особенностях работы веба.</p>
2 <p>Теперь мы привыкли к фреймворку и понимаем принципы создания приложений на нем, поэтому можно начинать работу с реальной базой данных.</p>
2 <p>Теперь мы привыкли к фреймворку и понимаем принципы создания приложений на нем, поэтому можно начинать работу с реальной базой данных.</p>
3 <p>Чтобы начать хранить и извлекать данные из базы, нам нужно выполнить несколько действий:</p>
3 <p>Чтобы начать хранить и извлекать данные из базы, нам нужно выполнить несколько действий:</p>
4 <ul><li>Установить зависимости, необходимые для работы с базой данных</li>
4 <ul><li>Установить зависимости, необходимые для работы с базой данных</li>
5 <li>Настроить подключение к базе данных и дать к нему доступ из приложения</li>
5 <li>Настроить подключение к базе данных и дать к нему доступ из приложения</li>
6 <li>Создать начальную структуру базы данных с нужными таблицами</li>
6 <li>Создать начальную структуру базы данных с нужными таблицами</li>
7 <li>Переписать методы репозиториев так, чтобы они работали с данными через базу</li>
7 <li>Переписать методы репозиториев так, чтобы они работали с данными через базу</li>
8 </ul><p>В этом уроке мы проделаем все эти шаги на примере создания части CRUD для сущности Car с полями manufacturer (марка) и model (модель).</p>
8 </ul><p>В этом уроке мы проделаем все эти шаги на примере создания части CRUD для сущности Car с полями manufacturer (марка) и model (модель).</p>
9 <h2>Устанавливаем зависимости</h2>
9 <h2>Устанавливаем зависимости</h2>
10 <p>Мы будем использовать базу данных PostgreSQL. Чтобы начать работать, вам потребуется установить библиотеку<a>psycopg</a>. Более детальную работу с psycopg мы будем рассматривать дальше, но пока вы можете изучить нашу<a>статью</a>.</p>
10 <p>Мы будем использовать базу данных PostgreSQL. Чтобы начать работать, вам потребуется установить библиотеку<a>psycopg</a>. Более детальную работу с psycopg мы будем рассматривать дальше, но пока вы можете изучить нашу<a>статью</a>.</p>
11 <h2>Настраиваем подключение</h2>
11 <h2>Настраиваем подключение</h2>
12 <p>Рассмотрим такой пример</p>
12 <p>Рассмотрим такой пример</p>
13 <p>В примере выше мы создаем соединение с базой данных. Соединение потребуется нам при создании репозитория, так как вся работа с базой будет сосредоточена там.</p>
13 <p>В примере выше мы создаем соединение с базой данных. Соединение потребуется нам при создании репозитория, так как вся работа с базой будет сосредоточена там.</p>
14 <h2>Строим начальную структуру базы данных</h2>
14 <h2>Строим начальную структуру базы данных</h2>
15 <p>В нашем случае база данных создается при старте приложения, поэтому ее инициализацию мы будем делать там же, во время старта. Для этого создадим файл с нужной схемой данных:</p>
15 <p>В нашем случае база данных создается при старте приложения, поэтому ее инициализацию мы будем делать там же, во время старта. Для этого создадим файл с нужной схемой данных:</p>
16 <ol><li><p>Добавляем файл<em>init.sql</em>:</p>
16 <ol><li><p>Добавляем файл<em>init.sql</em>:</p>
17 </li>
17 </li>
18 <li><p>Загружаем схему в базу. Postgres позволяет подключиться к удаленной базе указав ссылку на нее после флага -d.</p>
18 <li><p>Загружаем схему в базу. Postgres позволяет подключиться к удаленной базе указав ссылку на нее после флага -d.</p>
19 </li>
19 </li>
20 </ol><p>Для сборки приложения мы можем написать баш-скрипт build.sh вида:</p>
20 </ol><p>Для сборки приложения мы можем написать баш-скрипт build.sh вида:</p>
21 <p>Дальше сделаем скрипт исполняемым (chmod +x ./build.sh) и добавим такую команду в Makefile проекта:</p>
21 <p>Дальше сделаем скрипт исполняемым (chmod +x ./build.sh) и добавим такую команду в Makefile проекта:</p>
22 <p>Теперь мы можем указать эту команду на любом сервисе как команду сборки. Также мы отделяем сборку от кода, что дает больше свободы в конфигурации, и следует принципам<a>12 факторов</a>.</p>
22 <p>Теперь мы можем указать эту команду на любом сервисе как команду сборки. Также мы отделяем сборку от кода, что дает больше свободы в конфигурации, и следует принципам<a>12 факторов</a>.</p>
23 <h2>Создаем репозиторий CarRepository</h2>
23 <h2>Создаем репозиторий CarRepository</h2>
24 <p>В репозитории нам понадобится соединение с базой данных, так как вся работа с базой будет сосредоточена тут. Соединение будет передаваться в конструктор при создании объекта репозитория.</p>
24 <p>В репозитории нам понадобится соединение с базой данных, так как вся работа с базой будет сосредоточена тут. Соединение будет передаваться в конструктор при создании объекта репозитория.</p>
25 <p>Принцип создания всех методов для работы с базой данных одинаковый:</p>
25 <p>Принцип создания всех методов для работы с базой данных одинаковый:</p>
26 <ul><li>Описываем шаблон запроса</li>
26 <ul><li>Описываем шаблон запроса</li>
27 <li>Формируем стейтмент</li>
27 <li>Формируем стейтмент</li>
28 <li>Делаем подстановки</li>
28 <li>Делаем подстановки</li>
29 <li>Выполняем запрос</li>
29 <li>Выполняем запрос</li>
30 <li>Собираем результат</li>
30 <li>Собираем результат</li>
31 <li>Возвращаем ответ</li>
31 <li>Возвращаем ответ</li>
32 </ul><h2>Рассматриваем примеры операций</h2>
32 </ul><h2>Рассматриваем примеры операций</h2>
33 <p>Структура контроллеров не меняется, несмотря на все изменения, которые мы сделали. Как видно на примере ниже, правильная организация абстракций и разделение по слоям приводят к тому, что изменение внутренностей не оказывает особого влияния на строение приложения. Контроллеры работают с репозиторием через его методы и ничего не знают про его внутреннюю реализацию:</p>
33 <p>Структура контроллеров не меняется, несмотря на все изменения, которые мы сделали. Как видно на примере ниже, правильная организация абстракций и разделение по слоям приводят к тому, что изменение внутренностей не оказывает особого влияния на строение приложения. Контроллеры работают с репозиторием через его методы и ничего не знают про его внутреннюю реализацию:</p>
34 <p>Также в примере выше мы добавили фильтрацию в GET-форме по маршруту<em>/cars</em>. В реальных приложениях операции выборки, фильтрации, агрегации осуществляются внутри базы с помощью запросов. Современные базы данных выполняют такие операции гораздо быстрее и эффективнее, чем обработка средствами языка.</p>
34 <p>Также в примере выше мы добавили фильтрацию в GET-форме по маршруту<em>/cars</em>. В реальных приложениях операции выборки, фильтрации, агрегации осуществляются внутри базы с помощью запросов. Современные базы данных выполняют такие операции гораздо быстрее и эффективнее, чем обработка средствами языка.</p>