Работа с хранилищем
С алгоритмом работы со storage можно ознакомиться на примере UserStorage в модуле user.
Хранилище — это слой абстракции, который обеспечивает доступ к данным приложения. Оно позволяет взаимодействовать с базой данных и выполнять операции чтения, записи и изменения данных.
Хранилище UserStorage отвечает за работу с пользователями. Оно реализовано с использованием пакетов adapter и scanner, которые предоставляют возможность работы с базой данных и сканирования данных соответственно.
В конструкторе NewUserStorage создается экземпляр хранилища, который использует SQL-адаптер и кеш для доступа к данным.
Метод Create используется для создания новой записи пользователя в базе данных. При этом в качестве аргумента передается контекст и объект пользователя models.UserDTO, который затем передается в метод adapter.Create. Метод adapter.Create создает запись в базе данных, используя переданный объект пользователя.
Метод Update используется для обновления записи пользователя в базе данных. При вызове метода передается контекст и объект пользователя models.UserDTO, который затем передается в метод adapter.Update. Далее adapter.Update обновляет запись пользователя в базе данных, используя переданный объект пользователя и объект adapter.Condition, который содержит информацию о том, какие поля нужно обновить. После обновления записи в базе данных метод Update также обновляет кеш, чтобы обеспечить консистентность данных.
Метод GetByID используется для получения пользователя из базы данных по ID. При вызове метода передается контекст и ID пользователя. Метод сначала пытается получить данные из кеша, используя ключ user:{id}. Если данные не находятся в кеше, то он использует адаптер для получения данных из базы данных, обращаясь к методу adapter.List. Полученные данные затем записываются в кеш с помощью метода cache.Set. После этого GetByID возвращает объект пользователя.
Метод GetByIDs используется для получения списка пользователей по списку их ID из базы данных. При вызове метода передается контекст и список ID пользователей. GetByIDs использует метод adapter.List, чтобы получить данные из базы данных, и возвращает список пользователей.
Метод GetByFilter используется для получения списка пользователей из базы данных с помощью заданного условия adapter.Condition. При вызове метода передается контекст и объект условия. GetByFilter использует метод adapter.List для получения данных из базы данных и возвращает список пользователей.
Метод GetByEmail используется для получения пользователя из базы данных по его email. При вызове метода передается контекст и email пользователя. GetByEmail использует метод adapter.List для получения данных из базы данных и возвращает объект пользователя.
SQL adapter (DAO)
Адаптер, или DAO (Data Access Object), — это компонент приложения, отвечающий за взаимодействие с базой данных. Он инкапсулирует операции чтения и записи в БД и предоставляет удобный интерфейс для работы с данными.
В данном случае адаптер создан для работы с базой данных SQL и использует библиотеки SQLX и Squirrel для взаимодействия с БД и для сборки SQL-запросов соответственно.
Основные методы адаптера:
-
Create — создание записи в БД.
-
Upsert — создание записи в БД или ее обновление, если она уже существует.
-
GetCount — получение количества записей из БД.
-
List — получение списка записей из БД.
-
Update — обновление записи в БД.
Адаптер работает с объектами, которые реализуют интерфейс scanner.Tabler, который, в свою очередь, определяет методы для получения названия таблицы БД и ее полей.
Сборка запросов осуществляется с помощью библиотеки Squirrel, которая позволяет конструировать SQL-запросы с помощью цепочки методов. Также адаптер использует библиотеку SQLX для выполнения запросов к БД.
Метод List возвращает запрошенные данные в заданную переменную dest (destination), которая должна быть срезом структур, соответствующих таблице БД.
Метод Update обновляет записи в БД согласно переданному условию (в соответствии с заданной операцией).
Методы Create, Upsert и GetCount возвращают ошибку в случае возникновения проблем в процессе выполнения запроса.
Адаптер используется для инкапсуляции сложной логики работы с базой данных, для того чтобы упростить взаимодействие с данными и сделать код более читаемым и модульным.
С репозиторием из урока ты можешь ознакомиться по ссылке.