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

2 回复

尝试以下代码来检查是否可行

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()能正确处理这种情况。

回到顶部