使用 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 转到可选字段的主要内容,如果未能解决你的问题,请参考以下文章

如何将@noescape 注释添加到可选闭包

如何加到可选Kernel中?(jupyter notebook)

SwiftUI 中的可选绑定

检查可选数组是不是包含元素和显示视图

Drupal Views 将图像字段输出为可选链接

这种 malloc 的使用会导致“可选”结构字段吗?