一尘不染

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

go

我正在尝试通过IN运算符使用MySQL查询,并在Golang项目中使用未定义数量的参数。

我正在使用该软件包,github.com/go-sql- driver/mysql并尝试在此Stackoverflow答案上构建我的解决方案:如何使用Golang在SQL中执行IN查找?

我读过一些类似的文章,为我提供了一些建议,但是我被困在查询的执行部分,因为它不允许直接使用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一起使用吗?


阅读 181

收藏
2020-07-02

共1个答案

一尘不染

Stmt.Query() 具有可变参数:

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

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

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

// ...

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

或者,您可以预先构建SQL查询并执行而不传递查询参数。

2020-07-02