Mysql 将Sql结果集存储在嵌套结构中,如果为空则忽略
我试图将SQL查询数据集存储在一个结构中,并以JSON显示。我几乎做到了。现在的问题是,如果嵌套结构的结果集为空,那么我不想显示它 同样的问题,但在扫描时使用指针会导致恐慌,这可能是因为我使用的是Mysql 将Sql结果集存储在嵌套结构中,如果为空则忽略,mysql,go,Mysql,Go,我试图将SQL查询数据集存储在一个结构中,并以JSON显示。我几乎做到了。现在的问题是,如果嵌套结构的结果集为空,那么我不想显示它 同样的问题,但在扫描时使用指针会导致恐慌,这可能是因为我使用的是&user.Profile.Firstname 2015/11/01 16:42:16紧急恢复->运行时错误:无效内存地址或零指针取消引用 如果我移除指针,那么一切正常,只剩下空字段。我对如何实现这一目标感到困惑 package main import ( "database/sql"
&user.Profile.Firstname
2015/11/01 16:42:16紧急恢复->运行时错误:无效内存地址或零指针取消引用
如果我移除指针,那么一切正常,只剩下空字段。我对如何实现这一目标感到困惑
package main
import (
"database/sql"
"github.com/gin-gonic/gin"
_ "github.com/go-sql-driver/mysql"
"log"
)
type User struct {
Id int64
Username string
Email string
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()
r := gin.Default()
v1 := r.Group("api/v1/")
{
v1.GET("users", GetUsers)
}
r.Run(":8080")
}
func GetUsers(c *gin.Context) {
stmt, err := DB.Query("Select users.id, username , email , firstname , lastname 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() {
var user User
err := stmt.Scan(&user.Id, &user.Username, &user.Email, &user.Profile.Firstname, &user.Profile.Lastname)
if err != nil {
panic(err.Error())
}
users = append(users, user)
}
c.JSON(200, &users)
}
输出:
{
"Id": 1,
"Username": "test1",
"Email": "test1@example.com",
"Profile": {
"Firstname": "John",
"Lastname": "Doe"
}
},
{
"Id": 2,
"Username": "test2",
"Email": "test2@example.com",
"Profile": {
}
},
假设
gin
在封面下使用encoding/json
,如果您想省略一个空的配置文件
,我相信您需要它作为用户
中的指针:
type User struct {
....
Profile *Profile `json:",omitempty"`
}
注意:
“ommitempty”选项指定,如果字段具有空值(定义为false、0、nil指针、nil接口值)以及任何空数组、切片、映射或字符串,则应在编码中忽略该字段
它并不是说将检测到结构的零值
这将使您在从数据库扫描数据时遇到一些问题。您可以声明一个配置文件
,扫描其中,与零配置文件进行比较,并将其分配给用户
,如果该用户有以下数据:
var user User
var profile Profile
_ = stmt.Scan(&user.Id, &user.Username, &user.Email, &profile.Firstname, &profile.Lastname)
if profile != Profile{} {
user.Profile = &profile
}
我怀疑这不是最优雅的解决方案,但我希望这是正确的方向