Golang中如何将SQL查询结果切片注入结构体字段

Golang中如何将SQL查询结果切片注入结构体字段 我已经成功将查询结果存入一个切片变量 result:=[]tag{} 中。然而,我对 Golang 经验不足,不确定如何将结果填入 Sum 字段。

以下是我的代码,任何帮助都将不胜感激!

type Tag struct {
    Sum               string `json:"sum"`
    Query_desc        string `json:"Query_Desc"`
    Query_start_date  string `json:"Query_start_date"`
    Query_end_date    string `json:"Query_end_date"`
    Current_date      string `json:"Current_date"`
    Error_info        string `json:"Error_Info"`
}

func handler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Access-Control-Allow-Origin", "*")
    w.Header().Set("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept")

    db, err := sqlx.Connect("mysql", "****")

    date_1 := r.FormValue("date_1")
    date_2 := r.FormValue("date_2")

    var tag Tag

    result := []Tag{}

    Query := ("SELECT ROUND(SUM(duration)/3600,0) sum FROM sessions WHERE (app_id = 'idrice' OR app_id ='idrios' OR app_id ='**' OR **** ='**'OR app_id ='**') AND date(created ) between ? and ? and time(created ) between '16:00:00' and '18:00:00' AND (** `media_src` **='**' OR `media_src`='**' OR** `media_src` **='**' OR `media_src`='**' OR** `****` **='**' OR `****`='****') GROUP BY date(created)")

    err = db.Select(&result, Query, date_1, date_2)

    tag.Query_desc = "Listener Hours"
    tag.Query_start_date = date_1
    tag.Query_end_date = date_2
    dt := time.Now()
    tag.Current_date = dt.Format("01-02-2006 15:04:05")

    if err != nil {
        tag.Error_info = err.Error()
    }

    j, err := json.Marshal(tag)
    if err != nil {
        w.WriteHeader(http.StatusBadRequest)
        w.Write([]byte((err.Error())))
        return
    }
    w.Write(j)

}

func main() {
    http.HandleFunc("/", handler)
    log.Fatal(http.ListenAndServe(":8081", nil))
}

更多关于Golang中如何将SQL查询结果切片注入结构体字段的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

如果你尝试使用 db.QueryRowx("<SQL here>").Scan(&tag.Sum) 会怎样?

db.QueryRowx("<SQL here>").Scan(&tag.Sum)

更多关于Golang中如何将SQL查询结果切片注入结构体字段的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中,使用sqlx库的Select方法可以直接将SQL查询结果映射到结构体切片。你的代码已经基本正确,但需要调整几个地方:

  1. Select方法会自动填充result切片,不需要单独处理tag变量
  2. 查询结果应该直接作为JSON响应返回

以下是修改后的代码:

type Tag struct {
    Sum               string `json:"sum"`
    Query_desc        string `json:"Query_Desc"`
    Query_start_date  string `json:"Query_start_date"`
    Query_end_date    string `json:"Query_end_date"`
    Current_date      string `json:"Current_date"`
    Error_info        string `json:"Error_Info"`
}

func handler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Access-Control-Allow-Origin", "*")
    w.Header().Set("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept")
    w.Header().Set("Content-Type", "application/json")

    db, err := sqlx.Connect("mysql", "****")
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    defer db.Close()

    date_1 := r.FormValue("date_1")
    date_2 := r.FormValue("date_2")

    result := []Tag{}

    Query := "SELECT ROUND(SUM(duration)/3600,0) as sum FROM sessions WHERE (app_id = 'idrice' OR app_id ='idrios' OR app_id ='**' OR **** ='**'OR app_id ='**') AND date(created) between ? and ? and time(created) between '16:00:00' and '18:00:00' AND (** `media_src` **='**' OR `media_src`='**' OR** `media_src` **='**' OR `media_src`='**' OR** `****` **='**' OR `****`='****') GROUP BY date(created)"

    err = db.Select(&result, Query, date_1, date_2)
    
    response := make([]Tag, len(result))
    dt := time.Now()
    currentDate := dt.Format("01-02-2006 15:04:05")

    for i, row := range result {
        response[i] = Tag{
            Sum:              row.Sum,
            Query_desc:       "Listener Hours",
            Query_start_date: date_1,
            Query_end_date:   date_2,
            Current_date:     currentDate,
            Error_info:       "",
        }
    }

    if err != nil {
        errorResponse := Tag{
            Error_info: err.Error(),
        }
        response = []Tag{errorResponse}
    }

    j, err := json.Marshal(response)
    if err != nil {
        w.WriteHeader(http.StatusBadRequest)
        w.Write([]byte(err.Error()))
        return
    }
    w.Write(j)
}

如果你想要保持单个Tag结构体的响应格式(而不是切片),可以这样修改:

func handler(w http.ResponseWriter, r *http.Request) {
    // ... 前面的代码相同

    result := []Tag{}
    err = db.Select(&result, Query, date_1, date_2)
    
    var response Tag
    dt := time.Now()
    
    if err != nil {
        response.Error_info = err.Error()
    } else if len(result) > 0 {
        response = Tag{
            Sum:              result[0].Sum,
            Query_desc:       "Listener Hours",
            Query_start_date: date_1,
            Query_end_date:   date_2,
            Current_date:     dt.Format("01-02-2006 15:04:05"),
            Error_info:       "",
        }
    }

    j, err := json.Marshal(response)
    // ... 后面的代码相同
}

关键点:

  1. db.Select(&result, Query, date_1, date_2)会自动将查询结果映射到result切片中的Tag结构体
  2. SQL查询中的列名需要与结构体字段的db标签匹配,或者使用as别名
  3. 确保数据库列名sum与结构体字段Sum对应(不区分大小写)
回到顶部