【问题标题】:How to use sqlx to query mysql IN a slice?如何使用 sqlx 在切片中查询 mysql?
【发布时间】:2017-03-26 17:40:13
【问题描述】:

我想在 mysql 数据库中查询一个表的值 IN 一个切片:

var qids []int
//fill qids dynamically
err = database.SQL.Select(&quotes,
    "SELECT * FROM quote WHERE qid IN $1", qids)
if err != nil {
    log.Println(err)
}

但我收到此错误:

sql: converting Exec argument #0's type: unsupported type []int, a slice
quotes []

我该如何解决这个问题?

【问题讨论】:

标签: mysql go sqlx


【解决方案1】:

sqlx 有一个很好的帮手:In() 我们只需要准备带有 args 和 Rebind 的查询,如下所示:

var qids []int

// fills qids on query dynamically
query, args, err := sqlx.In("SELECT * FROM quote WHERE qid IN (?)", qids)
if err != nil {
    log.Fatal(err)
}

// sqlx.In returns queries with the `?` bindvar, we can rebind it for our backend
//
query = database.SQL.Rebind(query)  // database.SQL should be a *sqlx.DB

err = database.SQL.Select(&quotes, query, args...)
if err != nil {
    log.Fatal(err)
}

// or just in one line:

err = database.SQL.Select(&quotes, database.SQL.Rebind(query), args...)

另外我建议你看看这里:http://jmoiron.github.io/sqlx/ 有很多例子,包括 IN

【讨论】:

  • 这比我希望的要复杂得多,但仍然有效。谢谢。
【解决方案2】:

标签表明您使用的是sqlx。它在查询中有support for IN

所以你可以这样做

var qids []int
//fill qids dynamically
rows, err = db.Query(&quotes, "SELECT * FROM quote WHERE qid IN ($1)", qids)
if err != nil {
    log.Println(err)
}
// scan the rows

【讨论】:

  • 是的,我使用sqlx,但不知道为什么我仍然收到同样的错误。
  • 这个对我有用,如果您使用的是 mysql,只需将 $1 替换为 ?
【解决方案3】:

嘿,因为 []int
试试这个

type Int64Array []int64

// Value returns the driver compatible value
func (a Int64Array) Value() (driver.Value, error) {
var strs []string
for _, i := range a {
    strs = append(strs, strconv.FormatInt(i, 10))
}
return "{" + strings.Join(strs, ",") + "}", nil
}

然后将 int64 传递给查询

db.Queryx("SELECT * FROM quote WHERE qid IN $1", int64IDs)

更多详情请查看here

【讨论】:

    猜你喜欢
    • 2021-09-18
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多