请问使用gin+gorm做restful api如何通过传的参数只返回数据库中特定字段?
大概需求是我的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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
加一个tag,里面是omitempty试一下
加个json tag就可以了
不过我觉得你这样的结构是不对的:
数据库的model跟gin request&respone的model应该分开,拿完db的model再赋值给respone的model,然后输出才是比较好的结构设计
一句话就是不想定义struct,但golang并非是够浪,强类型语言,类型是基石,需要先定义struct。毕竟目前的golang并不是java,java里面是通过ASM动态修改二进制这类非法手段编码产生一个新的class。而GoLang都编译成exe了,已经是喂给操作系统最终的代码。除非哪天golang也搞出一个类似的通过元代码,在编译后隐式生成机器可读的struct。否则还是要什么,你就定义什么,动态生成至少眼下不行。
那就用gorm.db.Rows().Scan(&name,&genger)就行了嘛
需要自己实现scan到map中的逻辑,类似这样
`func scanToMap(sql string) ([]M, error) { // M map[string]interface{}
}`