简介
Golang 提供了database/sql包用于对SQL数据库的访问, 作为操作数据库的入口对象sql.DB, 主要为我们提供了两个重要的功能:
- sql.DB 通过数据库驱动为我们提供管理底层数据库连接的打开和关闭操作.
- sql.DB 为我们管理数据库连接池
需要注意的是,sql.DB表示操作数据库的抽象访问接口,而非一个数据库连接对象;它可以根据driver打开关闭数据库连接,管理连接池。正在使用的连接被标记为繁忙,用完后回到连接池等待下次使用。所以,如果你没有把连接释放回连接池,会导致过多连接使系统资源耗尽。
导入MySQL数据库驱动
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
通常来说, 不应该直接使用驱动所提供的方法, 而是应该使用 sql.DB, 因此在导入 mysql 驱动时, 这里使用了匿名导入的方式(在包路径前添加 _), 当导入了一个数据库驱动后, 此驱动会自行初始化并注册自己到Golang的database/sql上下文中, 因此我们就可以通过 database/sql 包提供的方法访问数据库了.
创建数据库配置目录和文件
在go的根目录下 新建 web/config目录 ,目录参考: /usr/local/go/web/config
在go的根目录下 新建 web/model目录 ,目录参考: /usr/local/go/web/model
在 config目录中,新建 config.yaml (配置)文件,内容如下:
common:
database:
#最大空闲连接数
max_idle_conns: 50
dbname: test
host: 127.0.0.1
port: 3306
username: root
password: 123456
在 config目录中,新建 config.go (获取配置)文件,内容如下:
package config
import (
"fmt"
"github.com/spf13/viper"
)
func Init() (interface{},error) { //模块中供其他包调用的方法,首字母必须大写
//viper设置 配置
viper.Set("name","abc")
fmt.Printf("name的值是%v\n",viper.GetString("name") )
//读取配置文件配置
viper.AddConfigPath("config")
viper.SetConfigName("config")
error := viper.ReadInConfig()
/*
代码解析:
viper.AddConfigPath("conf")用来指定yaml配置文件的路径
viper.SetConfigName("config")用来指定配置文件的名称
viper.ReadInConfig()是解析配置文件的函数,如果配置文件的路径错误获名称错误则解析失败,会报错误
viper.GetString("database.name")是用来从配置文件中根据层级关系来获取数据
最后,通过fmt.Println()对数据结果进行输出
*/
if(error != nil){
panic(error)
}
c := viper.AllSettings() //获取所有配置
return c,nil
}
//获取数据库配置信息
func GetDatabaseInfo() map[string]interface{} { //模块中供其他包调用的方法,首字母必须大写
return viper.GetStringMap("common.database")
}
//获取环境变量
func GetEnvInfo(env string) string {
viper.AutomaticEnv()
return viper.GetString(env)
}
在 model目录中,新建 model.go (模型数据库)文件,内容如下:
package model
import (
"fmt"
"strconv"
"web/config"
"database/sql"
_ "github.com/go-sql-driver/mysql" //这个引用是必不可少的,因为需要调用driver.go文件里的init方法来提供一个数据库驱动程序
)
/*
导入MySQL数据库驱动
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
通常来说, 不应该直接使用驱动所提供的方法, 而是应该使用 sql.DB, 因此在导入 mysql 驱动时, 这里使用了匿名导入的方式(在包路径前添加 _), 当导入了一个数据库驱动后, 此驱动会自行初始化并注册自己到Golang的database/sql上下文中, 因此我们就可以通过 database/sql 包提供的方法访问数据库了.
*/
var DB *sql.DB //声明全局变量
func Init() *sql.DB{
//加载配置文件
//这行代码的作用就是初始化一个sql.DB对象
config.Init()
//获取数据库配置
var dbconfig = config.GetDatabaseInfo();
var err error
var constring string
max_idle_conns := dbconfig["max_idle_conns"]
root := dbconfig["username"]
password := dbconfig["password"]
host := dbconfig["host"]
port := dbconfig["port"]
dbname := dbconfig["dbname"]
fmt.Printf("dbconfig的值是%v\n", dbconfig)
// constring 它的配置规则:
// 账号:密码@tcp(IP:端口号)/数据库名?parseTime=true&charset=utf8&loc=Local
constring = fmt.Sprintf("%s%s%s%s%s%s%d%s%s%s",root,":",password,"@tcp(",host,":",port,")/",dbname,"?parseTime=true&charset=utf8&loc=Local")
fmt.Printf("constring的值是%v\n", constring)
//打开mysql连接
DB,err = sql.Open("mysql",constring)
if(err != nil){
panic(err)
}
//设置最大超时时间 DB.SetMaxIdleConns(int)
// max_idle_conns类型是 type interface {}
//fmt.Sprintf("%d",max_idle_conns) 把 max_idle_conns 转换成字符串类型
//strconv.Atoi(string) 把 string转换成 int类型
max_idle_conns_int, _ := strconv.Atoi(fmt.Sprintf("%d",max_idle_conns))
DB.SetMaxIdleConns(max_idle_conns_int)
//建立链接
err = DB.Ping()
if nil != err{
panic(err)
}else{
fmt.Println("Mysql Startup Normal!")
}
return DB
}
在 web目录中,新建 testdb.go (测试db连接)文件,内容如下:
package main
import (
"fmt"
"web/model"
)
func main() {
initdb()
}
func initdb(){
var DB = model.Init()
//建立链接
err := DB.Ping()
if(err != nil){
panic("连接失败")
}
fmt.Printf("连接正常\n")
}
运行 go run testdb.go 即可,效果如下:
[root@localhost web]# go run testdb.go
name的值是abc
dbconfig的值是map[dbname:erp host:10.10.87.11 max_idle_conns:50 password:zhihuijia port:3306 username:root]
constring的值是root:zhihuijia@tcp(10.10.87.11:3306)/erp?parseTime=true&charset=utf8&loc=Local
Mysql Startup Normal!
连接正常
go mysql参考:https://www.cnblogs.com/Survivalist/articles/10439111.html