寻找一种在Golang MySQL中查看插值查询的方法

时间:2019-06-21 14:33:48

标签: go

因此,我有一个要调试的相当复杂的查询,但举一个简单的例子,我说这样的东西:

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

我将以通常的方式执行Query(),例如

db.Query(q, 1546300800,1561127488)

我想记录/打印/在任何情况下(用于调试)内插查询,最后以

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

想知道这里是否有人在骗我。

2 个答案:

答案 0 :(得分:1)

基于@mkopriva的评论,

  

Go中不存在,因为它不执行插值,因此查询字符串和参数值都发送到进行插值的db服务器。因此,如果数据库服务器不提供这样的功能,那么您就不走运了。或者,您可以尝试搜索进行插值的第三方程序包,但是,如果您发现要记住一个准确的信息,它需要与目标服务器的版本保持一致,否则,您可能会看到日志,与正在执行的实际查询不匹配

我无法使用工具来完成此操作,因为go从来没有内插查询。坚持吐出非插值查询以及大量参数。

答案 1 :(得分:-1)

您可以尝试以下操作-

注意:

  • 这有点麻烦,因为执行替换时顺序很重要。
  • 此外,也不建议使用此方法,因为如果用户可以任意设置这些查询参数,则很容易受到SQLi的攻击。<​​/ li>

为了举例:

    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)

同样,如果允许用户任意设置查询参数,这是不安全的。