关于Gorm的Gen忽略结构体零值问题解决

问题

最近在使用 Gorm 的新玩意 GEN 时遇到了点问题。比如 GORM 可以很方便的自定义数据库结构体,如果查询的字段为空可以直接使用反射 tag 忽略。
但是 GEN 是预先生成好结构体,导致不能手动修改生成的结构体模型,甚至 Time.time 类型的字段也不能完全为空。

哦对了,使用 select 确实会只返回特定字段。但是其他字段却是为空的,照样还是会被返回。
如果使用 for range 循环拿到指定的字段对性能开销太大了,不够优雅。

过程

期间翻阅了互联网,几乎没有关于 Gorm 的相关资料。文档也翻了翻,写的比较杂,不容易找到解决方案。
ChatGPT4/Google Gemini/Meta Llama 几乎全部阵亡,只能说 GEN 可能太新了。这几个 AI 都没领悟。

解决

最后还是 clade 给了思路。(后发优势就是好)
可以使用 GORM 的 scan 进行处理,GEN 只是封装了 GORM,照样可以用 scan

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//预先定义好模型
type CommunityResp struct {
CommunityID int64 `json:"community_id"`
CommunityName string `json:"community_name"`
}


//直接把模型传递给scan进行处理

func GetDbCommunity() (res []*models.CommunityResp, err error) {
community := query.Q.Community
err = community.WithContext(context.Background()).Select(community.CommunityID, community.CommunityName).Scan(&res)
if err != nil {
return nil, err
}
return
}

完美解决需求,还得是 AI。啃这个文档不知道得啃多久。