思路:把结果弄成[]map[string]string类型,这样就能把查询得到的数据都填充进去。
使用的是内置的库
database/sql
package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) var db *sql.DB func initDB() { var err error db, err = sql.Open("mysql", "superxon:superxon@(172.20.3.12:3306)/test?charset=utf8mb4") if err != nil { fmt.Println("open mysql failed,", err) } db.SetMaxIdleConns(5) db.SetMaxOpenConns(15) } func main() { initDB() defer db.Close() sqlStr := "SELECT * FROM user" //可以换成其它的查询语句,可以得到相应的查询结果,不用每次都去构建存放的结构体 rows, err := db.Query(sqlStr) if err != nil { fmt.Println(err) } defer rows.Close() //列出所有查询结果的字段名 cols, _ := rows.Columns() //values是每个列的值,这里获取到byte里 values := make([][]byte, len(cols)) //query.Scan的参数,因为每次查询出来的列是不定长的,用len(cols)定住当次查询的长度 scans := make([]interface{}, len(cols)) //让每一行数据都填充到[][]byte里面 for i := range values { scans[i] = &values[i] } res := make([]map[string]string, 0) for rows.Next() { _ = rows.Scan(scans...) row := make(map[string]string) for k, v := range values { //每行数据是放在values里面,现在把它挪到row里 key := cols[k] row[key] = string(v) } res = append(res, row) } fmt.Println(res) }
得到结果->
[map[age:20 id:1 name:张三 sex:男] map[age:21 id:2 name:李四 sex:女] map[age:20 id:4 name:小六 sex:女]]
到此这篇关于Golang 数据库操作(sqlx)和不定字段结果查询的文章就介绍到这了,更多相关Golang 数据库操作和不定字段结果查询内容请搜索