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查询结果映射到结构体切片。你的代码已经基本正确,但需要调整几个地方:
Select方法会自动填充result切片,不需要单独处理tag变量- 查询结果应该直接作为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)
// ... 后面的代码相同
}
关键点:
db.Select(&result, Query, date_1, date_2)会自动将查询结果映射到result切片中的Tag结构体- SQL查询中的列名需要与结构体字段的
db标签匹配,或者使用as别名 - 确保数据库列名
sum与结构体字段Sum对应(不区分大小写)

