请问使用gin+gorm做restful api如何通过传的参数只返回数据库中特定字段?

发布于 2022-09-12 00:01:09 字数 876 浏览 13 评论 0

大概需求是我的api需要根据调用方传的数据库字段名参数来只返回这些字段的数据。

请求格式:

https://host:port/resources/1?fields=field1,field2,field3...

我需要拿到fields,然后根据这些字段名去Select,然后只返回这些字段的数据,而不是表的所有字段。

伪代码:

type Example struct{
    Id uint64
    Name string
    Gender string
    Age uint8
}

var example Example

...

db.Table("example").Select("Name,Gender").Where("id = ?", 1).Scan(&example)

...

c.SecureJSON(http.StatusOK, gin.H{
    "msg":  http.StatusText(http.StatusOK),
    "data": example,
})

期望:
只返回包含Name和Gender的结果

实际:
Id、Name、Gender、Age都会返回,只不过Id和Age都是struct的默认值。

我知道可以Scan到一个新的struct,但是新的struct我依然要事先定义出来,我事先是不知道对方想要什么参数。而gorm的Scan又只支持Scan到struct或slice。不能Scan到map中。

请问这种问题如何解决,先谢过了。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

中二柚 2022-09-19 00:01:10

加一个tag,里面是omitempty试一下

捶死心动 2022-09-19 00:01:10
type Example struct{
    Id uint64     `json:",omitempty"`
    Name string   `json:",omitempty"`
    Gender string `json:",omitempty"`
    Age uint8     `json:",omitempty"`
}

加个json tag就可以了
不过我觉得你这样的结构是不对的:
数据库的model跟gin request&respone的model应该分开,拿完db的model再赋值给respone的model,然后输出才是比较好的结构设计

农村范ル 2022-09-19 00:01:10

一句话就是不想定义struct,但golang并非是够浪,强类型语言,类型是基石,需要先定义struct。毕竟目前的golang并不是java,java里面是通过ASM动态修改二进制这类非法手段编码产生一个新的class。而GoLang都编译成exe了,已经是喂给操作系统最终的代码。除非哪天golang也搞出一个类似的通过元代码,在编译后隐式生成机器可读的struct。否则还是要什么,你就定义什么,动态生成至少眼下不行。

几度春秋 2022-09-19 00:01:09

那就用gorm.db.Rows().Scan(&name,&genger)就行了嘛

凉薄对峙 2022-09-19 00:01:09

需要自己实现scan到map中的逻辑,类似这样
`func scanToMap(sql string) ([]M, error) { // M map[string]interface{}

rows, err := db.DB().Query(sql)
if err != nil {
    return nil, err
}
colCount, err := rows.Columns()
if err != nil {
    return nil, err
}
columns := make([]interface{}, len(colCount))
columnPointers := make([]interface{}, len(colCount))
queryResult := make([]M, 0)

for i := range columns {
    columnPointers[i] = &columns[i]
}

for rows.Next() {
    if err := rows.Scan(columnPointers...); err != nil {
        return nil, err
    }
    queryItem := M{}
    for k, v := range columns {
        key := colCount[k]
        queryItem[key] = getValue(v)
    }
    queryResult = append(queryResult, queryItem)
}
return queryResult, nil

}`

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文