Golang连接MySQL解析

Go连接MySQL需要两个组件: * database/sql * github.com/go-sql-driver/mysql

import (
	"database/sql"
	_ "github.com/go-sql-driver/mysql"
)

连接MySQL

db, err := sql.Open("mysql", "root:@tcp(localhost:3306)/test?charset=utf8")
if err != nil {
  fmt.Print(err)
}

db.SetMaxOpenConns(2000) // 最大连接数
db.SetMaxIdleConns(1000) // 最大空闲连接数
db.SetConnMaxLifetime(60 * time.Second) //连接的最大空闲时间(可选)
db.Ping()

注:如果MaxIdleConns大于0并且MaxOpenConns小于MaxIdleConns ,那么会将MaxIdleConns置为MaxIdleConns

查询数据

rows, err := db.Query(query, args...)
if err != nil {
  log.Fatalf(err.Error())
}
if rows == nil {
  return nil
}

// 获取查询到的行名,返回了一个[]string
cols, err := rows.Columns()

result := Row{}

rawResult := make([][]byte, len(cols))
dest := make([]interface{}, len(cols))
for i := range rawResult {
  dest[i] = &rawResult[i]
}

if rows.Next() {
	// 传一个内存地址数组进行切割后,分散传入,每个内存地址保存一个字段值。
	err = rows.Scan(dest...)
	// 将存在内存地址中的值,传给result
  for i, raw := range rawResult {
		// 将值以key=>value的形式进行存储.
    if raw == nil {
      result[cols[i]] = ""
    } else {
      result[cols[i]] = string(raw)
    }
  }
} else {
  return nil
}

_ = err
return result