Golang MySQL使用IN运算符查询未定义的args数量

时间:2016-08-30 09:34:50

标签: mysql go

我正在尝试使用带有未定义参数的IN运算符的MySQL查询到我的Golang项目中。

我正在使用包github.com/go-sql-driver/mysql并尝试在此Stackoverflow答案上构建我的解决方案:How to execute an IN lookup in SQL using Golang?

我已经阅读了一些类似的帖子,给我一些关于如何去的建议,但是我坚持查询的执行部分,因为它不允许直接使用切片作为参数。

//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,name FROM resources WHERE id IN(SELECT resource_id   FROM resources_types WHERE type_id IN(?,?))   “sql:statement需要2个输入;得到1”

当我尝试使用

时,它会起作用
rows, err := stmt.Query(args[0], args[1])

但是因为我需要一些未定义的参数,所以它不是一个解决方案。是否至少可以让它与MySQL一起工作?

1 个答案:

答案 0 :(得分:2)

Stmt.Query()有一个可变参数:

func (s *Stmt) Query(args ...interface{}) (*Rows, error)

这意味着您可以使用省略号...将切片值作为variadic参数的值传递,但该切片必须是[]interface{}类型,例如:

var args []interface{}
for _, v := range r.Form["type"] {
    t, _ := strconv.Atoi(v)
    args = append(args, t)
}

// ...

rows, err := stmt.Query(args...)

作为替代方案,您可以预先构建SQL查询并在不传递查询参数的情况下执行,例如,请参阅Go and IN clause in Postgres