Ищете способ просмотреть интерполированный запрос в golang mysql - PullRequest
0 голосов
/ 21 июня 2019

Итак, у меня есть довольно сложный запрос, который я пытаюсь отладить, но для простого примера, скажем, у меня есть что-то вроде этого:

q := "SELECT id FROM users WHERE timestamp > ? AND timestamp < ?"

Я сделаю Query () для этогообычным способом, например

db.Query(q, 1546300800,1561127488)

И я хотел бы записать / println / что угодно (для отладки) интерполированного запроса, чтобы в итоге получить

SELECT id FROM users WHERE timestamp > 1546300800 AND timestamp < 1561127488

Интересно, если у кого-то есть хитростьдля меня здесь.

Ответы [ 2 ]

1 голос
/ 21 июня 2019

Исходя из комментариев @ mkopriva,

Не в Go, поскольку не выполняет интерполяцию, и строка запроса, и значения аргумента отправляются на сервер db, который выполняет интерполяцию.Так что, если сервер БД не предоставляет такую ​​функцию, то вам не повезло.В качестве альтернативы вы можете попробовать поискать сторонний пакет, который выполняет интерполяцию, однако, если вы обнаружите, что имейте в виду, что для точности он должен соответствовать версии целевого сервера, если этого не происходит, вы можете увидеть журналы, которыене соответствует самому выполняемому запросу

Я не могу выполнить это с помощью инструментов, поскольку go никогда не имеет интерполированного запроса.Придерживаясь выплевывать не интерполированный запрос вместе с кучей аргументов.

0 голосов
/ 21 июня 2019

Вы можете попробовать что-то вроде следующего:

Примечание:

  • Это немного хакерский способ, так как порядок будет иметь значение при выполнении замены.
  • Кроме того, также не рекомендуется использовать этот метод, так как это делает вас уязвимым для SQLi, если эти параметры запроса могут быть произвольно установлены пользователем.

Для примера:

    queryParam1 := strconv.Itoa(1546300800)
    queryParam2 := strconv.Itoa(1561127488)

    // create new instance of *strings.Replacer
    replacer := strings.NewReplacer("?", queryParam1, "?", queryParam2)

    // prepare query with replacement instructions
    query := fmt.Sprint(
        replacer.Replace(
            "SELECT id FROM users WHERE timestamp > ? AND timestamp < ?",
        ),
    )

    // used for debugging
    log.Println("Query:", query)

    // execute query
    db.Query(query)

Опять же, это небезопасно, если вы разрешаете пользователям произвольно устанавливать параметры запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...