How to use sqlx to query mysql IN a slice?

后端 未结 3 1939
伪装坚强ぢ
伪装坚强ぢ 2021-01-04 23:37

I want to query a table in mysql database for values IN a slice:

var qids []int
//fill qids dynamically
err = database.SQL.Select("es,
          


        
相关标签:
3条回答
  • 2021-01-05 00:20

    Hey its because of []int
    try this

    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
    }
    

    and then pass int64 to query

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

    for more detail check here

    0 讨论(0)
  • 2021-01-05 00:24

    The tags suggest that you are using sqlx. It has support for IN in queries.

    So you can do

    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
    
    0 讨论(0)
  • 2021-01-05 00:40

    sqlx has a great helper for that: In() we just have to prepare the query taking the args and Rebind, like this:

    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...)
    

    Also I recommend you take a look here: http://jmoiron.github.io/sqlx/ there're a lot of examples including IN

    0 讨论(0)
提交回复
热议问题