go实践七 连接mysql数据库 - Go语言中文社区

go实践七 连接mysql数据库


简介

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的值是%vn",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的值是%vn", 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的值是%vn", 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

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/daily886/article/details/95592913
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-02-25 00:28:13
  • 阅读 ( 1416 )
  • 分类:数据库

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢