В этом уроке мы спроектируем модель для работы с базой данных нашего проекта.

Если вам не нравится термин модель, вы можете использовать название уровень обслуживания или уровень доступа к данным. Как данный паттерн не назови, идея состоит в том, что мы инкапсулируем код для работы с MySQL в отдельный пакет которого можно использовать в остальной части нашего веб-приложения.

Премиум 👑 канал по Golang

Рекомендуем вам супер TELEGRAM канал по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании! 😎

Подписаться на канал

Уроки, статьи и Видео

Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.

Go в ВК ЧАТ в Telegram

Содержание статьи

Сейчас мы создадим скелет модели базы данных, которая возвращает тестовые данные. Прежде чем мы перейдем к мельчайшим деталям SQL-запросов, давайте разберем данный паттерн поподробнее.

Звучит неплохо? Давайте создадим пару новых папок и файлов в каталоге pkg:

Модель MySQL базы данных

Запомните: Папка pkg используется для хранения вспомогательного кода, не зависящего от приложения, который может использоваться повторно. Модель базы данных, которая может использоваться другими приложениями в будущем (например, приложение с интерфейсом командной строки), соответствует всем требованиям.

Мы начнем с использования файла pkg/models/models.go, чтобы определить типы данных верхнего уровня, которые модель базы данных будет использовать и возвращать. Откройте данный файл и добавьте следующий код:

Обратите внимание, как названия полей структуры Snippet соответствуют полям в MySQL таблице snippets?

Перейдем к файлу pkg/models/mysql/snippets.go, который будет содержать код, специально предназначенный для работы с заметками в нашей MySQL базе данных. В этом файле мы определим новый тип SnippetModel и реализуем в нем некоторые методы для доступа и управления базой данных. К примеру:

Важно отметить оператор импорта для golangify.com/snippetbox/pkg/models. Обратите внимание, что путь импорта для внутреннего пакета указан с префиксом в виде выбранного пути модуля.

Создание модели базы данных в Go

Чтобы использовать эту модель в наших обработчиках, требуется вызвать новую структуру SnippetModel в функции main(), а затем внедрить ее как зависимость через структуру application — точно так же, как мы это делали с другими зависимостями.

Это делается следующим образом:

Преимущества модели базы данных

Такая настройка моделей может показаться немного сложной и запутанной, особенно если вы новичок в Go. Однако по мере того, как наше веб-приложение продолжает расти, должно стать яснее, почему мы выбрали именно такую структуру.

Если вы вспомните все проделанное, то сможете осознать несколько преимуществ:

  • Присутствует четкое разделение проблем. Логика базы данных не привязана к нашим обработчикам, а это означает, что обязанности обработчика ограничены HTTP элементами (то есть проверкой запросов и возвращение ответов). Это упростит написание тестов в будущем;
  • Создав настраиваемый тип SnippetModel и реализовав для него методы, мы смогли сделать модель одним аккуратно инкапсулированным объектом, который можно легко инициализировать и затем передать обработчикам в качестве зависимости. Это упрощает поддержку и тестирование кода;
  • Так как действия модели определены как методы объекта — в данном случае, у SnippetModel — есть возможность создать интерфейс и смоделировать его для тестирования;
  • Мы полностью контролируем, какая база данных используется во время работы, используя флаг из командной строки;
  • В конечном итоге структура каталогов хорошо масштабируется, если у проекта есть несколько бэкэндов. К примеру, если некоторые данные хранятся на Redis, можно поместить все их модели в пакет pkg/models/redis.

Скачать исходный код

Под каждой статьей из этого курса у нас есть актуальный архив с текущей версией нашего веб-приложения.

Скачать: snippetbox-18.zip

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *