Как заполнить сложную структуру в 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
                      }
                  ]
}
  • Вопрос задан
  • 146 просмотров
Решения вопроса 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
}


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

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

Похожие вопросы