Gorm 查询指定字段并返回
今天使用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两个字段,输出的也只有这两个字段。