func (maker *courseMaker) GetByID(id int64) (*Course, error) { var ( err error get_course string = queries["get_course"] get_course_members string = queries["get_course_members"] get_course_teachers string = queries["get_course_teachers"] course *Course = NewCourse() studentIDs []int64 = []int64{} teacherIDs []int64 = []int64{} stmt *sqlx.Stmt acid util.AcidTx ) // Get the course's name. acid = func(tx *sqlx.Tx) { // Add the course stmt, err = tx.Preparex(get_course) PanicOnError(err) err = stmt.Get(course, id) PanicOnError(err) // Get the rows out of course_members stmt, err = tx.Preparex(get_course_members) PanicOnError(err) err = stmt.Select(&studentIDs, id) PanicOnError(err) // Get the rows out of course_teachers stmt, err = tx.Preparex(get_course_teachers) PanicOnError(err) stmt.Select(&teacherIDs, id) PanicOnError(err) for _, studentID := range studentIDs { student, err := StudentStore.GetByID(studentID) PanicOnError(err) course.Students = append(course.Students, student) } for _, teacherID := range teacherIDs { teacher, err := TeacherStore.GetByID(teacherID) PanicOnError(err) course.Teachers = append(course.Teachers, teacher) } } err = util.AcidCtx(acid, maker) if err != nil { return nil, err } return course, nil }
func (d Datastore) Get(table string, model interface{}, id interface{}) error { query := fmt.Sprintf("SELECT * FROM %v %v", table, string(table[0])) var stmt *sqlx.Stmt var err error if table == "orders" { return d.parseOrders(model, id) } if id != nil { query += fmt.Sprintf(" where %v.id = $1", string(table[0])) stmt, err = d.Db.Preparex(query) stmt.Select(model, id) } else { stmt, err = d.Db.Preparex(query) stmt.Select(model) } return err }