Gorm 查询指定字段并返回

作者: adm 分类: go 发布时间: 2021-09-30 10:12

今天使用gorm查询的时候想查询指定字段,发现使用Find(&article)的话,会把结构体的数据都返回,但我response的时候不想让别人看到其他字段。

Scan() 方法

例如以下Model结构体,我只想查询id和tilte两个字段并返回json。

type Article struct {
   Id          uint64 `json:"id"`
   Title       string `json:"title"`
   Content     string `json:"content"`
   Status      uint8  `json:"status"`
   CreateTime  uint64 `json:"createTime"`
}

如果我们只是单纯的指定Select(“id,title”).Scan(&article),我们依然会获取到完整的结构体,只不过相比较Find(&article)来说,其他字段都是默认值。

var article Article
db.Table(article.GetTableName()).Select("id,title").Where("id = ?", 1).Scan(&article)

fmt.Println(article)
// {1 Gorm查询指定字段并返回   0 0}

// 返回json格式自然也都是默认值
{
    "code"0,
    "msg""success",
    "data": {
        "id"1,
        "title""Gorm查询指定字段并返回",
        "content""",
        "status"0,
        "publishTime"0,
    },
    "requestID"1600652635844513
}

那其他字段怎么才能不返回?我们指定json格式字段不返回就行了

type Article struct {
   Id          uint64 `json:"id"`
   Title       string `json:"title"`
   Content     string `json:"-"`
   Status      uint8  `json:"-"`
   CreateTime  uint64 `json:"-"`
}

// 返回json格式
{
    "code"0,
    "msg""success",
    "data": {
        "id"1,
        "title""Gorm查询指定字段并返回"
    },
    "requestID"1600652635844513
}

当然,这也不适用复杂情况,因为同一个结构体可能会被多个输出复用,这样指定关键字段不返回会适用所有情况,然而我再其他地方可能需要这个字段输出,所以我们再往下看。


结构体也可以这样写,实现公用,以免写多个结构体导致混乱。

type Article struct {
   Id          uint64 `json:"id,omitempty" gorm:"id,omitempty"`
   Title       string `json:"title,omitempty" gorm:"title,omitempty"`
   Content     string `json:"content,omitempty" gorm:"content,omitempty"`
   Status      uint8  `json:"status,omitempty" gorm:"status,omitempty"`
   CreateTime  uint64 `json:"createTime,omitempty" gorm:"createTime,omitempty"`
}

当我们指定omitempty情况下,字段不存在结构体就会忽略该字段。比如存gorm的时候只有id,title的情况下,该结构体只会输入这两个字段;当返回json格式的时候,只查出id,title两个字段,输出的也只有这两个字段。

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!