Golang SQL查询错误:*[]main.Tag中缺少目标名称Sum
Golang SQL查询错误:*[]main.Tag中缺少目标名称Sum 我尝试将SQL查询的结果填充到结构体的Sum字段中,但尽管结构体中存在Sum字段,却遇到了这个错误。
根据REACT界面中输入的日期,查询结果可能包含1到8个数字。
package main
import (
"encoding/json"
"log"
"net/http"
"time"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
type Tag struct {
Sum string `json:"Sum"`
Stream_count string `json:"stream_count"`
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", "****")
if err != nil {
log.Print(err.Error())
log.Print("Error Connecting to DB")
w.WriteHeader(http.StatusBadRequest)
w.Write([]byte(err.Error()))
return
}
defer db.Close()
date_1 := r.FormValue("date_1")
date_2 := r.FormValue("date_2")
time_1 := r.FormValue("time_1")
time_2 := r.FormValue("time_2")
var tag Tag
Query := ("SELECT SUM(duration) Sum FROM sessions WHERE (app_id = '****' OR app_id ='****' OR app_id ='****' OR app_id ='****'OR app_id ='****') AND date(created ) between ? and ? and time(created ) between ? and ? AND (`media_src`='https://livestream.indemandradio.com/stream/index.m3u8' OR `media_src`='****' OR `media_src`='****' OR `media_src`='****' OR `media_src`='****' OR `media_src`='****') GROUP BY date(created)")
err = db.Get(&tag, Query, date_1, date_2, time_1, time_2)
log.Print(tag.Sum)
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查询错误:*[]main.Tag中缺少目标名称Sum的实战教程也可以访问 https://www.itying.com/category-94-b0.html
尝试以下代码来检查是否可行
var sum int
err = db.Get(&sum, Query, date_1, date_2, time_1, time_2)
如果这能工作,那看起来 SQL 对字段名有些困惑,所以也许将 SUM(duration) 改为 Suma 或其他名称可能会解决问题……
更多关于Golang SQL查询错误:*[]main.Tag中缺少目标名称Sum的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
问题出在你的SQL查询使用了GROUP BY date(created),这会返回多行结果(每日期一行),但你的代码试图用db.Get()将多行结果映射到单个Tag结构体。db.Get()只适用于单行查询。
以下是两种解决方案:
方案1:使用db.Select()获取多行结果(推荐)
func handler(w http.ResponseWriter, r *http.Request) {
// ... [前面的代码保持不变]
var tags []Tag // 改为切片
Query := ("SELECT SUM(duration) Sum FROM sessions WHERE (app_id = '****' OR app_id ='****') AND date(created) between ? and ? and time(created) between ? and ? AND (`media_src`='https://livestream.indemandradio.com/stream/index.m3u8') GROUP BY date(created)")
err = db.Select(&tags, Query, date_1, date_2, time_1, time_2) // 使用Select
// 处理结果
for _, tag := range tags {
log.Print(tag.Sum)
}
// 如果需要返回所有结果
j, err := json.Marshal(tags)
if err != nil {
w.WriteHeader(http.StatusBadRequest)
w.Write([]byte(err.Error()))
return
}
w.Write(j)
}
方案2:移除GROUP BY获取单行总和
func handler(w http.ResponseWriter, r *http.Request) {
// ... [前面的代码保持不变]
var tag Tag
// 移除GROUP BY获取所有日期的总和
Query := ("SELECT SUM(duration) Sum FROM sessions WHERE (app_id = '****' OR app_id ='****') AND date(created) between ? and ? and time(created) between ? and ? AND (`media_src`='https://livestream.indemandradio.com/stream/index.m3u8')")
err = db.Get(&tag, Query, date_1, date_2, time_1, time_2)
log.Print(tag.Sum)
// ... [后面的代码保持不变]
}
错误信息"missing destination name Sum in *[]main.Tag"实际上是因为sqlx试图将多行结果映射到切片时,某一行缺少Sum字段值(可能是NULL)。使用db.Select()能正确处理这种情况。

