使用 SQLX 转到可选字段
Posted
技术标签:
【中文标题】使用 SQLX 转到可选字段【英文标题】:Go optional fields with SQLX 【发布时间】:2018-12-18 21:44:51 【问题描述】:我正在学习 Go 并试图创建一个具有“字段”参数的 api 端点。当我尝试将 sqlx 结果行扫描到一个结构中时,但是用户省略的字段作为空字符串返回。有没有办法可以更改结构以仅反映用户传递的字段?我不认为我想使用 omitempty
以防例如 user_name 是一个空字符串。
type User struct
Id int `db:"id"`
UserName string `db:"user_name"`
func GetUsers(w http.ResponseWriter,r *http.Request,db *sqlx.DB)
acceptedFields := map[string]bool
"id":true,
"user_name":true,
var requestedFields string = "id"
if r.URL.Query().Get("fields") != ""
requestedFields = r.URL.Query().Get("fields");
for _, requestedField := range strings.Split(requestedFields,",")
if !acceptedFields[requestedField]
http.Error(w, fmt.Sprintf("Unknown Field '%s'",requestedField), http.StatusBadRequest)
users := []User
err := db.Select(&users,fmt.Sprintf("SELECT %s FROM users",requestedFields));
if err != nil
log.Fatal(err)
response, _ := json.Marshal(users)
fmt.Fprintf(w,string(response))
结果端点输出
/users?fields=id
=> ["Id":12,"UserName":""]
所需的端点输出
/users?fields=id
=> ["Id":12]
同样使用 sql.NullString 会导致:
["Id":12,"UserName":"String":"","Valid":false]
【问题讨论】:
要么使用指向带有 omitempty 的字符串的指针(仅当指针为 nil 时才会省略字段,而不是指向空字符串的指针),或者实现自定义类型,如 sql.NullString 但它实现了 json.Marshaler 接口。 当我使用指针方法时,我得到的响应是["Id":12,"UserName":null]
而不是 ["Id":12]。
不要忘记省略 json 标签选项。
感谢工作。
【参考方案1】:
感谢 mkorpriva,这是一个解决方案
type User struct
Id int `db:"id"`
UserName *string `db:"user_name" json:",omitempty"`
【讨论】:
以上是关于使用 SQLX 转到可选字段的主要内容,如果未能解决你的问题,请参考以下文章