Перейти необязательные поля с SQLX - PullRequest
0 голосов
/ 19 декабря 2018

Я изучаю Go и пытаюсь создать конечную точку API с параметром 'fields'.Когда я пытаюсь отсканировать получаемые строки 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}}]

1 Ответ

0 голосов
/ 19 декабря 2018

Благодаря mkorpriva вот решение

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