Skip to content

Instantly share code, notes, and snippets.

Created September 14, 2017 16:29
Show Gist options
  • Select an option

  • Save anonymous/7353523fe1641492652f812b22c778b6 to your computer and use it in GitHub Desktop.

Select an option

Save anonymous/7353523fe1641492652f812b22c778b6 to your computer and use it in GitHub Desktop.
package main
import (
"encoding/json"
"database/sql"
)
type JSONScanner struct {
Key string
Map map[string]interface{}
}
func (s JSONScanner) Scan(src interface{}) error {
s.Map[s.Key] = src
}
func QueryToJSON(db *sql.DB, query string, args ...interface{}) ([]byte, error) {
rows, err := db.Query(query, ...args)
if err != nil {
return nil, err
}
defer rows.Close()
var items []interface{}
var scanners []*JSONScanner
names, err := rows.Columns()
if err != nil {
return nil, err
}
for _, name := range(names) {
scanners = append(scanners, &JSONScanner{Key: name})
}
for rows.Next() {
item := make(map[string]interface{})
for _, scanner := range(scanners) {
scanner.Map = item
}
items = append(items, item)
if err = rows.Scan(...scanners); err != nil {
return nil, err
}
}
if err = row.Err(); err != nil {
return nil, err
}
return json.Marshal(items)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment