Как заполнить сложную структуру в Go, одним запросом c БД mysql?

У нас есть 2 таблицы:
таблица №1
Учителя
id   class       teacher_name
1     1a          Мария Ивановна
2     1б          Евгения Васильевна
3     1в          Анастасия Юрьевна


таблица №2
Ученики
id     class     fio                             age
1       1c        Петров Иван                     7
2       1a        Егоров Василий                  7
3       1a        Анастасия Юрьевна               6


У нас есть структуры
type Student type{
    Fio      string     `json:"fio" db:"fio"`
    Age      string     `json:"age" db:"age"`
}

type MyClass type{
    Class                    string           `json:"class" db:"class"`
    TeacherName              string           `json:"teacher_name" db:"teacher_name"`
    Students                 []Student      `json:"students" db:"students"`
}

должно получиться что то вроде:
{
  "class":"1a",
  "teacher_name":"Мария Ивановна",
  "students":[
                      {
                        "fio":"Егоров Василий"
                        "age":7
                      },
                      {
                        "fio":"Анастасия Юрьевна"
                        "age":6
                      }
                  ]
}
  • Вопрос задан
  • 142 просмотра
Решения вопроса 1
yellow79
@yellow79
Senior Software Engineer
Примерно как-то так:
const query = `
SELECT 
    A.class, A.fio, A.age, B.teacher_name
FROM 
    students A 
	LEFT JOIN teachers B ON A.class = B.class`

func scan(db *sql.DB) (*MyClass, error) {
	rows, err := db.Query(query)
	if err != nil {
		return nil, err
	}
	class := MyClass{}
	for rows.Next() {
		var a, b, c, d string
		if err := rows.Scan(&a, &b, &c, &d); err != nil {
			return nil, err
		}
		class.Class = a
		class.TeacherName = d
		class.Students = append(class.Students, Student{Age: c, Fio: b})
	}
	return &class, nil
}


Возможно есть ошибки, код не проверял, накидал "на коленке", думаю смысл должен быть понятен
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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