问题
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,
"SELECT * FROM quote WHERE qid IN $1", qids)
if err != nil {
log.Println(err)
}
But I get this error:
sql: converting Exec argument #0's type: unsupported type []int, a slice
quotes []
How can I fix this?
回答1:
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("es, query, args...)
if err != nil {
log.Fatal(err)
}
// or just in one line:
err = database.SQL.Select("es, 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
回答2:
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
回答3:
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("es, "SELECT * FROM quote WHERE qid IN ($1)", qids)
if err != nil {
log.Println(err)
}
// scan the rows
来源:https://stackoverflow.com/questions/40565805/how-to-use-sqlx-to-query-mysql-in-a-slice