因此,我有一个要调试的相当复杂的查询,但举一个简单的例子,我说这样的东西:
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
想知道这里是否有人在骗我。
答案 0 :(得分:1)
基于@mkopriva的评论,
Go中不存在,因为它不执行插值,因此查询字符串和参数值都发送到进行插值的db服务器。因此,如果数据库服务器不提供这样的功能,那么您就不走运了。或者,您可以尝试搜索进行插值的第三方程序包,但是,如果您发现要记住一个准确的信息,它需要与目标服务器的版本保持一致,否则,您可能会看到日志,与正在执行的实际查询不匹配
我无法使用工具来完成此操作,因为go从来没有内插查询。坚持吐出非插值查询以及大量参数。
答案 1 :(得分:-1)
您可以尝试以下操作-
注意:
为了举例:
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)
同样,如果允许用户任意设置查询参数,这是不安全的。