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>