Create a Map in Golang from database Rows

lucidquiet picture lucidquiet · Jul 24, 2013 · Viewed 29.7k times · Source

Basically after doing a query I'd like to take the resulting rows and produce a []map[string]interface{}, but I do not see how to do this with the API since the Rows.Scan() function needs a specific number of parameters matching the requested number of columns (and possibly the types as well) to correctly obtain the data.

Again, I'd like to generalize this call and take any query and turn it into a []map[string]interface{}, where the map contains column names mapped to the values for that row.

This is likely very inefficient, and I plan on changing the structure later so that interface{} is a struct for a single data point.

How would I do this using just the database/sql package, or if necessary the database/sql/driver package?

Answer

elithrar picture elithrar · Jul 25, 2013

Look at using sqlx, which can do this a little more easily than the standard database/sql library:

places := []Place{}
err := db.Select(&places, "SELECT * FROM place ORDER BY telcode ASC")
if err != nil {
    fmt.Printf(err)
    return
}

You could obviously replace []Place{} with a []map[string]interface{}, but where possible it is better to use a struct if you know the structure of your database. You won't need to undertake any type assertions as you might on an interface{}.