IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    golang mysql查询返回不定字段

    mckee发表于 2015-12-20 17:45:23
    love 0

    golang mysql查询返回不定字段实现如下:
    首先通过func (rs *Rows) Columns() ([]string, error)获取查询字段的slice,然后构造slice,将每次scan出来的值放进去,最后返回查询结果的map slice。

    package main
    
    import (
    	"database/sql"
    	"fmt"
    	_ "github.com/go-sql-driver/mysql"
    )
    
    func main() {
    	conn, err := sql.Open("mysql", "root:psw@tcp(localhost:3306)/test?charset=utf8")
    	if err != nil {
    		fmt.Println("mysql connect error")
    		return
    	}
    
    	defer conn.Close()
    	rows, err := conn.Query("select * from user")
    	if err != nil {
    		fmt.Println("mysql query error", err.Error())
    	}
    	defer rows.Close()
    	columns, err := rows.Columns()
    
    	values := make([]sql.RawBytes, len(columns))
    	scans := make([]interface{}, len(columns))
    
    	for i := range values {
    		scans[i] = &values[i]
    	}
    
    	var result []map[string]string
    	for rows.Next() {
    		_ = rows.Scan(scans...) 
    		each := make(map[string]string)
    
    		for i, col := range values {
    			each[columns[i]] = string(col)
    		}
    
    		result = append(result, each)
    
    	}
    
    	fmt.Println(result)
    }

    同理查询单条也可以这样操作:
    func main() {
    	conn, err := sql.Open("mysql", "root:psw@tcp(localhost:3306)/test?charset=utf8")
    	if err != nil {
    		fmt.Println("mysql connect error", err.Error())
    		return
    	}
    
    	defer conn.Close()
    
    	columns := []string{"id", "name"}
    	id := 1
    	sql := fmt.Sprintf("select %s from user where id=%d", strings.Join(columns, ", "), id)
    	row := conn.QueryRow(sql)
    
    	values := make([][]byte, len(columns))
    	scans := make([]interface{}, len(columns))
    
    	for i := range values {
    		scans[i] = &values[i]
    	}
    
    	if err := row.Scan(scans...); err != nil {
    		fmt.Println("scan error", err.Error())
    		return
    	}
    
    	var result = make(map[string]string)
    	for key, val := range values {
    		result[columns[key]] = string(val)
    	}
    
    	fmt.Println(result)
    }



沪ICP备19023445号-2号
友情链接