阅读 171

GO语言 - mysql查询封装

1. mysql 连接函数
// 引入两个库
import (
    "database/sql"
    _ "github.com/go-sql-driver/mysql" // sql依赖这个mysql扩展
)

// 创建 mysql 连接
func NewMysqlConn(db *sql.DB, err error) {
    db, err = sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8")
    return
}
复制代码
2. mysql查询单条(将 sql.Rows 转化为 map )
func GetResultRow(rows *sql.Rows) map[string]string{
    columns, _ := rows.Columns()    // 获取列
    scanArgs := make([]interface{}, len(columns))   // 填充数据
    values := make([]interface{}, len(columns)) // 存放数据值
    
    // 将values的指针存放到scanArgs里
    for i := range values {
        scanArgs[i] = &values[i]
    }
    // 用来装整个查询结果的map
    record := make(map[string]string)
    for rows.Next() {
        // Scan方法赋值
        rows.Scan(scanArgs...)
        // 因为指针绑定,所以values里有值了,遍历赋值给record
        for i, v := range values {
            if v != nil {
                record[columns[i]] = string(v.([]byte)) // 需要进行断言,然后string方法转化为字符串
            }
        }
    }
    return record
}

复制代码
3.获取多条记录(将 sql.Rows 转化为 map[int]map[string]string)
func GetResultRows(rows *sql.Rows) map[int]map[string]string {
    // 返回所有列
    columns, _ := rows.Columns()
    // 这里标识一行所有列的值,用 []byte 表示
    vals := make([][]byte, len(columns))
    // 这里标识一行填充数据
    scans := make([]interface{}, len(columns))
    // 这里scans 引用vals 把数据填充到 []byte 里
    for k, _ := range vals {
        scan[k] = &val[k]
    }
    i := 0
    result := make(map[int]map[string]string)
    for row.Next() {
        // 填充数据
        rows.scan(scans...)
        // 每行数据
        row := make(map[string]string)
        // 把vals中的数据赋值到row中
        for k, v := range vals {
            key := columns[k]
            // 这里把[]byte数据转化成string
            row[key] = string(v)
        }
        // 放入结果集
        result[i] = row
        i++
    }
    return result
}
复制代码