Я создаю вложенные структуры из результатов LEFT JOIN - как бы вы улучшили мой код / сделали его более идиоматичным?
Использование Scan вызывает проблемы со значениями указателя nil, и я бы хотел избежать использования указателейвнутри структур просто как решение для ЛЕВОГО СОЕДИНЕНИЯ.
Могу ли я использовать отражающий пакет вместо ручного сопоставления столбцов со структурами?
rows, err := db.Queryx(`SELECT
category.id, category.parentId, category.name, category.createdAt, category.updatedAt,
item.id, item.categoryId, item.name, item.createdAt, item.updatedAt
FROM category
LEFT JOIN item ON item.categoryId=category.id
ORDER BY category.id ASC`)
if err != nil {
return nil, errors.Wrap(err, "Failed to exec category select with items")
}
results := []*CategoryWithItems{}
var prevID int64
var c *CategoryWithItems
for rows.Next() {
row, err := rows.SliceScan()
if err != nil {
return nil, errors.Wrap(err, "Failed to execute SliceScan")
}
categoryID := row[0].(int64)
if prevID == 0 || categoryID != prevID {
c = &CategoryWithItems{
Category:Category{
ID: categoryID,
ParentID: row[1].(int64),
Name: string(row[2].([]uint8)),
CreatedAt: row[3].(time.Time),
UpdatedAt: row[4].(time.Time),
},
Items: []*Item{},
}
results = append(results, c)
prevID = categoryID
}
if row[5] != nil {
i := &Item{
ID: row[5].(int64),
CategoryID: row[6].(int64),
Name: string(row[7].([]uint8)),
CreatedAt: row[8].(time.Time),
UpdatedAt: row[9].(time.Time),
}
c.Items = append(c.Items, i)
}
}