登录
首页 >  Golang >  Go问答

将数据库结果扫描到嵌套结构数组中

来源:stackoverflow

时间:2024-04-22 20:00:37 461浏览 收藏

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《将数据库结果扫描到嵌套结构数组中》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

问题内容

我希望将数据库连接的结果扫描到结构数组中,其中还包括嵌套结构数组。但是,当扫描结果并且嵌套数组的切片中的值全部为零时...该切片不会省略空。假设数组第二个位置的切片充满零值。我仍然有该切片的 {} 输出。我尝试创建顶级结构 users 的空切片,但随后抛出错误: index[0] out of range 并且我发现自己陷入了循环。没有看到与这个特定问题相关的任何内容,我看到了有关嵌套结构的问题,但没有看到有关嵌套结构数组的问题。有什么帮助让切片省略?

是的,我的结构标签中确实有 omitempty

package main

import (
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
    "log"
)

type User struct {
    Id       int64 `json:",omitempty"`
    Username string `json:",omitempty"`
    Email    string `json:",omitempty"`
    Profile  []*Profile `json:",omitempty"`
}

type Profile struct {
    Id        int64  `json:",omitempty"`
    UserId    int64  `json:",omitempty"`
    Firstname *string `json:",omitempty"`
    Lastname  *string `json:",omitempty"`
}

var DB *sql.DB

func checkErr(err error, msg string) {
    if err != nil {
        log.Fatal(msg, err)
    }
}

func main() {
    DB, _ = sql.Open("mysql", "username:secrect@/database")
    defer DB.Close()

}


func GetUsers() {
    stmt, err := DB.Query("Select users.id, username , email , firstname AS firstName1 , lastname AS lastName1, firstname AS firstName2 , lastname AS lastName2 from users left join profiles on users.id = profiles.user_id ")
    if err != nil {
        panic(err.Error())
    }
    defer stmt.Close()

    users := []User{}

    for stmt.Next() {
        user := User{Profile: Profile{{}}}
        err := stmt.Scan(&user.Id, &user.Username, &user.Email, &user.Profile[0].Firstname, &user.Profile[0].Lastname, &user.Profile[1].Firstname, &user.Profile[1].Lastname)
        if err != nil {
            panic(err.Error())
        }

        users = append(users, user)
    }
}

解决方案


您正在尝试将基于行的 sql 查询的结果集加载到不基于行的多级数据结构中。您可以处理联接的结果集并填写结构,也可以执行两个查询,一个查询用于获取 user,另一个查询用于获取与其关联的 profiles。

您的结果集将包含每个用户的多行,因此您必须处理结果并根据您获取的结果构建结构。像这样的东西应该有效:

for stmt.Next() {
      var userId, userName, userEmail, firstName, lastName string
         err := stmt.Scan(&userId, &userName, &userEmail, &firstName,&lastName)
        if err != nil {
            panic(err.Error())
        }
        user:=findUser(users,userId)
        if user==nil {
           // Add new user
           user:=&User{Id:userId,Name:userName,Email:userEmail}
           // Add user to users
        }
        user.Profiles=append(user.Profiles,&Profile{/* Fill profile fields here*/}))

    }

您提到的 json 标签仅适用于 json 编组/解组。它们与数据库操作无关。

终于介绍完啦!小伙伴们,这篇关于《将数据库结果扫描到嵌套结构数组中》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>