我正在尝试通过IN运算符使用MySQL查询,并在Golang项目中使用未定义数量的参数。
我正在使用该软件包,github.com/go-sql- driver/mysql并尝试在此Stackoverflow答案上构建我的解决方案:如何使用Golang在SQL中执行IN查找?
github.com/go-sql- driver/mysql
我读过一些类似的文章,为我提供了一些建议,但是我被困在查询的执行部分,因为它不允许直接使用slice作为参数。
//converting my form args []string into []int var args []int for _, v := range r.Form["type"] { t, _ := strconv.Atoi(v) args = append(args, t) } sql := "SELECT id, name FROM resources WHERE id IN (SELECT resource_id FROM resources_types WHERE type_id IN (?" + strings.Repeat(",?", len(args)-1) + "))" fmt.Println("Query : ", sql) stmt, _ := db.Prepare(sql) rows, err := stmt.Query(args) defer stmt.Close()
Golang在执行时向我返回错误:
查询:SELECT ID,名称从资源WHERE ID IN(SELECT resource_id从资源类型WHERE type_id IN(?,?))“ sql:语句需要2个输入;得到1个”
当我尝试
rows, err := stmt.Query(args[0], args[1])
但是由于我需要数量不确定的参数,所以这不是解决方案。至少有可能使其与MySQL一起使用吗?
Stmt.Query() 具有可变参数:
Stmt.Query()
func (s *Stmt) Query(args ...interface{}) (*Rows, error)
这意味着您可以使用省略号...将切片值作为可变参数的值传递,但是该切片必须为类型[]interface{},例如:
...
[]interface{}
var args []interface{} for _, v := range r.Form["type"] { t, _ := strconv.Atoi(v) args = append(args, t) } // ... rows, err := stmt.Query(args...)
或者,您可以预先构建SQL查询并执行而不传递查询参数。