Struct

将查询结果转换为一个struct对象,查询结果应当是特定的一条记录,并且pointer参数应当为struct对象的指针地址(*struct或者**struct),使用方式例如:

// 获取默认配置的数据库对象(配置名称为"default")
db := g.DB()

type User struct {
    Id         int
    Passport   string
    Password   string
    NickName   string
    CreateTime gtime.Time
}
user := new(User)
err  := db.Model("user").Where("id", 1).Struct(user)

或者

user := &User{}
err  := db.Model("user").Where("id", 1).Struct(user)

前两种方式都是预先初始化对象(提前分配内存),推荐的方式:

user := (*User)(nil)
err  := db.Model("user").Where("id", 1).Struct(&user)

这种方式只有在查询到数据的时候才会执行初始化及内存分配。注意在用法上的区别,特别是传递参数类型的差别(前两种方式传递的参数类型是*User,这里传递的参数类型其实是**User)。

Structs

将多条查询结果集转换为一个[]struct/[]*struct数组,查询结果应当是多条记录组成的结果集,并且pointer应当为数组的指针地址,使用方式例如:

users := ([]User)(nil)
// 或者 var users []User
err := db.Model("user").Structs(&users)

或者

users := ([]*User)(nil)
// 或者 var user []*User
err := db.Model("user").Structs(&users)

Scan

该方法会根据输入参数pointer的类型选择调用Struct还是Structs方法。如果结果是特定的一条记录,那么调用Struct方法;如果结果是slice类型则调用Structs方法。






















Content Menu

  • No labels

2 Comments

  1. gf 1.16, 我有一个model里面有个字段长这样:   ArtId    uint64 `orm:"id,primary"       json:"artId"`    // 文章id

    它进行查询时是没有问题的,where(xxx.Artid)它会知道是xxx的id,

    但是,对于查询到的数据进行 struct或scan 就不行了,无法将数据的id赋给xx.Artid里,还是原来的默认值0

  2. v2.1.1版本里没有struct和structs方法了,只能用scan映射到pointer struct。

    user := (*User)(nil)
    err := db.Model("user").Where("id", 1).Scan(&user)

    users := ([]User)(nil)
    err := db.Model("user").Scan(&users)

    users := ([]*User)(nil)
    err := db.Model("user").Scan(&users)