postgresql - 使用 SQLX 转到可选字段

标签 postgresql go mux

我正在学习 Go 并尝试创建一个具有“字段”参数的 API 端点。当我尝试将 sqlx 结果行扫描到结构中时,但是用户省略的字段将作为空字符串返回。有没有办法可以更改结构以仅反射(reflect)用户传递的字段?我不认为我想使用 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}}]

最佳答案

感谢 mkorpriva 这里有一个解决方案

type User struct {
    Id int `db:"id"`
    UserName *string `db:"user_name" json:",omitempty"`
}

关于postgresql - 使用 SQLX 转到可选字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53841547/

相关文章:

go - 无法使用基本身份验证保护 gorilla/mux 子路由

hibernate - 让 Hibernate 生成外键索引

json - 如何列出 Gorilla Mux 中的所有变量?

postgresql - Postgres : updating not-changed rows

go - 我怎么能从 golang 源复制一个包来破解

error-handling - Go 错误处理、类型断言和 net 包

go - 将 map 嵌入到go语言的结构中

Go 和 Gorilla Mux NotFoundHandler 不工作

postgresql - 使用Spark JdbcRDD读取PostgreSQL表出错

postgresql - PostgreSQL 代码的哪一部分正在处理类型定义?