Gorm Scan не привязывается к структуре

Я хотел бы получить результат сырого sql-запроса. Запрос следующий

res := []response.UserListByDivisionMember{}
db.Raw(`SELECT 
    parentPosFlat.posParentCode AS departmentFlatId,
    employee.gsId,
    employee.email,
    CONCAT(employee.firstname,
            ', ',
            employee.lastName) AS userName,
    division.externalCode AS departmentId,
    division.name AS departmentName,
    position.code AS positionId,
    position.name AS positionName,
    gsRoom.name AS room,
    gsRoom.id AS roomId
FROM
    division
        JOIN
    position AS parentPosition ON division.externalCode = parentPosition.department
        JOIN
    positionInPositionFlat AS parentPosFlat ON parentPosition.code = parentPosFlat.posParentCode
        JOIN
    position ON parentPosFlat.posChildCode = position.code
        JOIN
    employee ON position.code = employee.position
        LEFT JOIN
    gsRoom ON employee.gsRoomId = gsRoom.id
WHERE
    division.externalCode = ?`, divisionId).Scan(&res)

Результат запроса имеет такую ​​структуру  введите описание изображения здесь

Я хотел бы привязать результаты к следующей структуре:

type UserListByDivisionMember struct {
    DepartmentFlatId string `json:"departmentFlatId"`
    GsId             string `json:"gsId"`
    Email            string `json:"email"`
    UserName         string `json:"userName"`
    DepartmentId     string `json:"departmentId"`
    DepartmentName   string `json:"departmentName"`
    PositionId       string `json:"positionId"`
    PositionName     string `json:"positionName"`
    Room             string `json:"room"`
    RoomId           string `json:"roomId"`
}

После выполнения операции сканирования запроса я вижу в консоли, что запрос вернул 50 строк, что является правильным, но когда я отлаживаю приложение, результат содержит только поле адреса электронной почты из структуры. Я уже пытался изменить имена с маленькой версии на заглавную, но результат тот же.

введите описание изображения здесь


person Sándor Jankovics    schedule 03.08.2020    source источник


Ответы (1)


Имена полей вашей структуры и имена столбцов не совпадают.

Согласно документам:

Имена столбцов будут представлять собой имя поля в нижнем регистре змеи.

У вас есть два варианта:

Измените имена сгенерированных столбцов в операторе SQL:

parentPosFlat.posParentCode AS department_flat_d,
employee.gsId as gs_id,
...
gsRoom.name AS room,
gsRoom.id AS room_id

Или переопределите имя столбца с помощью структурных тегов:

type UserListByDivisionMember struct {
    DepartmentFlatId string `gorm:"column:departmentFlatId"`
    GsId             string `gorm:"column:gsId"`
    ...
    Room             string `gorm:"column:room"`
    RoomId           string `gorm:"column:roomId"`
}
person Marc    schedule 03.08.2020