Как передать параметр nil / null хранимой функции? - PullRequest
0 голосов
/ 23 марта 2020

Сервер получает запрос GET с параметром territory_id. Этот параметр может быть nil, если пользователю не нужен фильтр по территории, или может иметь номер integer, если пользователь хочет получать записи только для указанной c территории.

Код:

func GetDataList (response http.ResponseWriter, request * http.Request) {
    params: = GetRequestParams (request.URL.Query ())
    normalID, _: = strconv.Atoi (params ["normal_id"])
    territoryId, _: = strconv.Atoi (params ["territory_id"])

    var listToCheck [] ObjectDataNormal
    query = `select * from get_list_for_predict (year: = $1, territory_in: = $2)`
    rows, err = db.Queryx (query,
        2011,
        territoryId)
    if rows! = nil {
            // code
    }
    // code
}

func GetRequestParams (values url.Values) map [string] string {
    urlValues: = make (map [string] string, len (values))
    for k, v: = range values   {
        urlValues   [k] = v [0]
    }
    return urlValues
}

Хранимая процедура в postgresql разработана таким образом, что если territory_in равно ISNULL, то фильтр для этого параметра не работает, в противном случае, если territory_in равен 5, например, записи берутся там, где значение в поле территории равно 5.

И как реализовать это на стороне сервера? Если я положу territory_id = nil в почтальон, я получу:

ERROR: invalid input syntax for integer: "nil"

Если ноль, то:

ERROR: invalid input syntax for integer: "null".

Также territroyID не может быть равным nil. Как передать null в функцию в зависимости от запроса пользователя?

Теоретически я могу проверить в почтовых функциях territory_in = 0 вместо IS NULL. Поскольку при преобразовании string в int (strconv.Atoi (params ["territory_id"])) territory_in он будет установлен в 0. Но мне интересно, как отправить нулевой параметр в функцию хранения в golang?

Я использую sqlx и pgx.

1 Ответ

1 голос
/ 24 марта 2020

Если вы сохраните territoryId как *int вместо int, вы можете передать nil:

func strToIntPtr(s string) *int {
    i, err := strconv.Atoi(s)
    if err != nil {
        return nil
    }
    return &i 
}

territoryId := strToIntPtr(params["territory_id"])

И тогда territoryId будет nil каждый раз, когда это не действительный int. Таким образом, они могут передать nil, null или any (или все, что не является числом), и вы просто воспринимаете это как null.

...