【问题标题】:Golang MySQL querying undefined amount of args using IN operatorGolang MySQL使用IN运算符查询未定义数量的参数
【发布时间】:2016-08-30 17:56:42
【问题描述】:

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

我正在使用包 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: 语句需要 2 个输入;得到 1"

当我尝试使用时它可以工作

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

但由于我需要未定义数量的参数,这不是解决方案。至少有可能让它与 MySQL 一起工作吗?

【问题讨论】:

    标签: mysql go


    【解决方案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 查询并在不传递查询参数的情况下执行,例如参见 Go and IN clause in Postgres

    【讨论】:

    • 感谢您的明确答复!它已经在工作,但我要检查预构建查询。
    猜你喜欢
    • 2020-11-05
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 2015-01-30
    相关资源
    最近更新 更多