为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

红糖糍粑 2022-03-07 16:00:59
我正在尝试使用带有未定义参数数量的 IN 运算符在我的 Golang 项目中使用 MySQL 查询。我正在使用该包github.com/go-sql-driver/mysql并尝试在此 Stackoverflow 答案上构建我的解决方案:如何使用 Golang 在 SQL 中执行 IN 查找?我读过一些类似的帖子,给了我一些关于前进方向的建议,但我被困在查询的执行部分,因为它不允许直接使用切片作为参数。//converting my form args []string into []intvar args []intfor _, 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: 语句需要 2 个输入;得到 1”当我尝试时它有效rows, err := stmt.Query(args[0], args[1])但由于我需要未定义数量的参数,这不是解决方案。至少有可能让它与 MySQL 一起工作吗?
查看完整描述

1 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

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


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

这意味着您可以使用省略号...将切片值作为可变参数的值传递,但该切片必须是 type []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 子句。


查看完整回答
反对 回复 2022-03-07
  • 1 回答
  • 0 关注
  • 280 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信