Skip to content

Работа с хранилищем

С алгоритмом работы со 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 возвращают ошибку в случае возникновения проблем в процессе выполнения запроса.

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

С репозиторием из урока ты можешь ознакомиться по ссылке.