Golang中如何将SQL查询结果追加到数组

Golang中如何将SQL查询结果追加到数组 我的结构如下:

type Year struct {
    Yname string
}

type Data struct {
        Years   []*Year
}

以及一个查询:

selDB1, err := db.Query("SELECT DISTINCT YEAR(Rdate) as years FROM report_monthly  ORDER BY report_monthly_id DESC")
if err != nil {
    panic(err.Error())
}

for selDB1.Next() {
    var years string
    err = selDB1.Scan(&years)
    if err != nil {
        panic(err.Error())
    }

如何将SQL结果集追加到数组(res)中? 之后我执行一个模板:

tmpl.ExecuteTemplate(w, "IndexReport", res)

在我的模板中我想要实现:

{{range .Years}}
YEAR IS: {{.Yname}}
{{end}}

更多关于Golang中如何将SQL查询结果追加到数组的实战教程也可以访问 https://www.itying.com/category-94-b0.html

10 回复

TSTSTS:

我正在编写这段代码但遇到了错误

具体是什么错误?

另外,res 是一个结构体,你不能直接对它进行追加操作。你需要对其 Years 字段进行追加。

更多关于Golang中如何将SQL查询结果追加到数组的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


正如你总是在切片上进行追加操作……在循环中使用 s := append(s, years)

func main() {
    s := []int{1, 2, 3}
    years := 4
    s = append(s, years)
    fmt.Println(s)
}

感谢 @NobbZ,以下是完整代码。除了提到的代码部分外,其他一切运行正常。

我只需要将两个不同结构的数组发送到模板……这花了我很多天时间,现在真的卡在这里了……

func main() {
    fmt.Println("hello world")
}

发布更多代码并不会改变我的分析结果,最多只能帮助确认我对编译器报错行的判断。

我甚至不会尝试修复你的代码,原因如下:

  1. 我无法访问你的数据库
  2. 我不了解你的数据库配置情况
  3. 你没有将问题合理简化成可复现的案例,而是不断抛出更多代码

我已经解释了问题所在,并建议你重新思考类型设计。你没有照做,只是一味索要现成解决方案。

如果你真的想等待别人直接给出答案,请自便,我是不会替你完成的。

我的情况有点复杂,我写了这段代码但一直报错:我是Go语言新手。能帮帮我吗?

res := Data{}
selDB1, err := db.Query("SELECT DISTINCT YEAR(Rdate) as years FROM report_monthly  ORDER BY report_monthly_id DESC")
if err != nil {
    panic(err.Error())
}

for selDB1.Next() {
    var years string
    err = selDB1.Scan(&years)
    if err != nil {
        panic(err.Error())
    }

    f1 := Year{Yname: years}
    res = append(res, f1)
}

你发布的代码似乎不是完整的文件,至少缺少包声明和导入语句,因此我们无法确定确切的代码行号。

不过我认为引用的错误信息指的是这两行代码:

    person := Data{Years:  []*Year{&res},
                   Months: []*Month{&resm}}

res 的类型是 []Yearresm 的类型是 []Month

[]*Year{&res} 试图创建一个 *Year 类型的切片,其中包含单个元素 &res,而 &res 的类型是 *[]Year,这两者类型不匹配。

看起来你需要重新考虑如何设置类型和中间表示形式,特别要注意确保它们能够相互匹配。

抱歉信息不够完整,上面是完整的代码。如您所见,我有两个查询,它们的结果集已成功添加到 resresm 数组中。然后我想将它们添加到 person 结构体中,并将其发送到 IndexReport 模板。这就是我期望得到的结果…

我遇到的错误与 person 结构体有关:

[root[@abc](/user/abc) report_m]# go run main.go 
# command-line-arguments
./main.go:132:36: cannot use &res (type *[]Year) as type *Year in array or slice literal
./main.go:133:37: cannot use &resm (type *[]Month) as type *Month in array or slice literal
[root[@abc](/user/abc) report_m]# 

这里我需要帮助,先谢谢了。

TSTSTS:

./main.go:129:21: append 的第一个参数必须是切片;实际类型为 struct { Yname string; Selected bool }

./main.go:133:17: 未定义: f1

我不确定这些行号如何对应到你提供的代码,所以只能猜测。

第129行可能是 res = append(res, f1),我在上一篇文章中已经解释过为什么这行不通。错误信息也确实明确指出了这一点。

第133行可能是 log.Println(f1),当你执行到这一行时,f1 并不在作用域内,因为它只在循环体的最后两行中定义。


编辑

你希望 res 实际具有什么类型?是 Data 类型还是 []Year 类型?

如果是前者,应该是 res.Years = append(res.Years, &years);如果是后者,应该是 res = append(res, years),但你需要使用 res := make([]Year, 0) 而不是 res := Year{}

func main() {
    fmt.Println("hello world")
}

感谢NobbZ,当我运行代码时遇到了错误:

# command-line-arguments
./main.go:129:21: append的第一个参数必须是切片;当前是struct { Yname string; Selected bool }
./main.go:133:17: f1未定义

这是我的代码: 你能帮我看看并给出专业意见吗,我哪里做错了…

func ShowMonth(w http.ResponseWriter, r *http.Request) {
    db := dbConn()
    res := Year{}
    selDB1, err := db.Query("SELECT DISTINCT YEAR(Rdate) as years FROM report_monthly  ORDER BY report_monthly_id DESC")
    if err != nil {
        panic(err.Error())
    }

    for selDB1.Next() {
        var years string
        err = selDB1.Scan(&years)
        if err != nil {
            panic(err.Error())
        }

        f1 := Year{Yname: years}
        res = append(res, f1)
    }

    log.Println(f1)
  // tmpl3.ExecuteTemplate(w, "IndexReport", f1)
    defer db.Close()
}

您需要创建一个Data实例,然后在循环中将每个查询结果作为Year指针追加到Years切片中。以下是完整的解决方案:

type Year struct {
    Yname string
}

type Data struct {
    Years []*Year
}

func main() {
    // 创建Data实例
    res := &Data{
        Years: make([]*Year, 0),
    }
    
    selDB1, err := db.Query("SELECT DISTINCT YEAR(Rdate) as years FROM report_monthly ORDER BY report_monthly_id DESC")
    if err != nil {
        panic(err.Error())
    }
    defer selDB1.Close()

    for selDB1.Next() {
        var years string
        err = selDB1.Scan(&years)
        if err != nil {
            panic(err.Error())
        }
        
        // 创建Year实例并追加到切片中
        year := &Year{Yname: years}
        res.Years = append(res.Years, year)
    }
    
    // 检查循环中的错误
    if err = selDB1.Err(); err != nil {
        panic(err.Error())
    }
    
    // 执行模板
    tmpl.ExecuteTemplate(w, "IndexReport", res)
}

您的模板代码是正确的,可以直接使用:

{{range .Years}}
YEAR IS: {{.Yname}}
{{end}}

这样,查询结果中的每个年份都会作为Year对象存储在res.Years切片中,模板可以正确遍历并显示每个年份的Yname字段。

回到顶部