Bjornsen
@Bjornsen
Happy coder

Как маппить результат запроса бд в структуры со вложенностями Golang?

Наверняка кто-то уже сталкивался с проблемой маппинга выдачи бд в структуры с вложенной иерархией в языке Го. Проблема у меня следующая - есть постгрес бд, есть драйвер pgx, есть запрос, который запрашивает одну сущность и джоинит к ней еще две. Сущности имеют следующую вложенность Game <- Round <- RoundType и выглядят примерно так:
type Game struct {
    ...
    Rounds []Round
}

type Round struct {
    ...
    RoundType RoundType
}

type RoundType struct {
    ...
}


Сам pgx не предоставляет удобного функционала сканирования результатов выдачи в нужные структуры, поэтому по советам из интернетов я поставил scany, но проблема оказалась в том, что эта либа не умеет маппить результат во вложенные структуры. Можно заэмбеддить одну структуру в другую, но тогда результат маппинга будет плоская структура, а не со вложенностями. Отсюда вопрос тем, кто использует pgx - как вы маппите сложные выдачи бд в структуры с определенным уровнем вложенностей? Я в итоге написал свой маппер для одной из функций, но он получился довольно объемный и в нем легко допустить ошибку, которая не отловится, пока сам не увидишь, что что-то смаппилось не туда, неужели это единственный подход и надо для каждой выдачи писать свой маппер или все таки есть какой то более простой выход из ситуации?
  • Вопрос задан
  • 260 просмотров
Пригласить эксперта
Ответы на вопрос 1
- Я считаю, что свой кастомный маппер - это отличное решение. Чтобы быть уверенней, обязательно напишите тесты. Как unit, так и интеграционные, например, с помощью testcontainers.

- Можете вместо pgx посмотреть в сторону sqlc. У него совершенно другой подход. Вы пишете запрос со всеми джойнами, а он вам автоматически генерирует код со всеми структурами и функциями. Правда, там по джойнам практически отсутствует документация, но уж погуглите.

- Ну, и если совсем сложно... то... может одним глазком глянуть в сторону ORM? Я никому не расскажу...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы