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

3
我正在尝试在我的Golang项目中使用MySQL查询,使用IN操作符,并且参数数量是未定义的。
我使用了包github.com/go-sql-driver/mysql,并尝试按照这个Stackoverflow答案构建我的解决方案:如何在Golang中执行IN查找? 我阅读了一些类似的帖子,给了我一些关于如何处理的建议,但我卡在了查询的执行部分,因为它不允许直接将切片用作参数。
//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 expects 2 inputs; got 1"

当我尝试使用以下内容时,它可以正常工作:

rows, err := stmt.Query(args[0], args[1])

但是由于我需要一个未定义的参数数量,这不是一种解决方案。至少使用MySQL可以使其工作吗?

1个回答

2

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查询并执行,而不传递查询参数。例如,请参见在Postgres中使用Go和IN子句


谢谢您的清晰回答!它已经可以工作了,但我将检查预构建查询。 - user2094540

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接