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

hwamh0ep  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(271)

我想把db连接的结果扫描到一个结构数组中,这个数组也包括一个嵌套的结构数组。但是,当扫描结果并且嵌套数组切片中的值都为零时…切片不会忽略空值。假设数组第二个位置的切片充满了零值。我还有一个 {} 为了那一块。我尝试过创建顶层结构的空切片 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)
    }
}
eiee3dmh

eiee3dmh1#

您正在尝试将基于行的sql查询的结果集加载到不基于行的多级数据结构中。您可以处理连接的结果集并填写结构,也可以执行两个查询,一个用于获取 User 另一个去拿 Profile 与之相关的。
您的结果集将为每个用户包含多个行,因此您必须处理结果并基于您获取的结果构造结构。这样的方法应该有用:

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封送/解封送。它们与数据库操作无关。

相关问题