我有一个像这个例子的SQL select语句:
queryValues = make([]interface{}, 0, 5)
queryValues = append(Name, obj.Name)
queryValues = append(Age, obj.Age)
whereClause := "where name = $1 and age = $2"
query := fmt.Sprintf("Select * from Table1 %s;", whereClause)
rows, err := dbConnection.Query(query, queryValues...)
我在这里有几个问题。在queryValues之后是什么...为什么当我查看传递给db的查询时,$ 1中的任何一个实际上都没有被转换为实际值?
我可以运行什么打印功能来模仿dbConnection.Query(query,queryValues ...),以便在传递之前看到它?
提前致谢。
约什
答案 0 :(得分:0)
您的第一个问题的答案是查询是什么被称为可变函数https://golang.org/ref/spec#Function_types。它接受最后一个类型的任意数量的参数,并作为切片传递给函数。
queryValues ...与此相反。它将您的切片作为单独的参数传递给查询。它做的就像你做的那样:
dbConnection.Query(query, queryValues[0], queryValues[1])
https://golang.org/ref/spec#Passing_arguments_to_..._parameters
在这种特殊情况下,您不需要[]界面{}
dbConnection(query, obj.Name, obj.Age)
您的$ 1,$ 2占位符未被转换的原因可能是因为您使用了错误的占位符来处理您正在使用的特定驱动程序。它取决于驱动程序本身。例如,MySQL驱动程序使用'?'作为它的占位符。