这是我参与「第五届青训营 」笔记创作活动的第10天
gorm支持多种数据库连接,目前官方列出来的支持库有:MySQL, PostgreSQL, SQLite, SQL Server 四种数据库连接。在我们要开发的抖声项目中中,选择使用 MySQL 来作为后端数据库。
数据库连接
首先需要导入mysql包和gorm包
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
连接数据库
dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
这一句的意思是用户名:密码@tcp(数据库ip或域名:端口)/数据库名称?charset=数据库编码&parseTime=True&loc=Local
Toml配置文件
数据库中数据库名称,用户名,密码等参数可以通过toml配置文件配置
安装
go get github.com/BurntSushi/toml
编写配置文件(/conf/conf_toml.toml)
# mysql库
[mysql]
host = "10.0.0.1"
port = 3306
user = "douyin"
password = "douyin@123"
maxIdle = 2
maxConn = 10
编写go程序
package main
import (
"fmt"
"github.com/BurntSushi/toml"
"os"
)
// Mysql 一个mysql库对于的结构体
type Mysql struct {
Host string
Port int32
User string
Password string
MaxIdle int32
MaxConn int32
}
// Config 定义一个结构体接收toml所有配置
type Config struct {
Mysql map[string]Mysql
}
// github.com/BurntSushi/toml
func main() {
path, _ := os.Getwd()
configPath := path + "/conf/conf_toml.toml"
config := &Config{Mysql: make(map[string]Mysql)}
_, err := toml.DecodeFile(configPath, config)
if err != nil {
fmt.Println(err.Error())
}
fmt.Println(config)
fmt.Println(config.Mysql)
fmt.Println(config.Mysql.Host)
fmt.Println(config.Mysql.User)
}
数据库连接池
在高并发实践中,为了提高数据库连接的使用率,避免重复建立数据库连接带来的性能消耗,会经常使用数据库连接池技术来维护数据库连接。
gorm自带了数据库连接池使用非常简单只要设置下数据库连接池参数即可。
数据库连接池使用例子:
定义tools包,用来管理gorm数据库连接池的初始化工作。
package tools
//定义全局的db对象,我们执行数据库操作主要通过他实现。
var _db *gorm.DB
//包初始化函数,golang特性,每个包初始化的时候会自动执行init函数,这里用来初始化gorm。
func init() {
// 声明err变量,下面不能使用:=赋值运算符,否则_db变量会当成局部变量,导致外部无法访问_db变量
var err error
//连接MYSQL, 获得DB类型实例,用于后面的数据库读写操作。
_db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("连接数据库失败, error=" + err.Error())
}
sqlDB, _ := db.DB()
//设置数据库连接池参数
sqlDB.SetMaxOpenConns(100) //设置数据库连接池最大连接数
sqlDB.SetMaxIdleConns(20) //连接池最大允许的空闲连接数,如果没有sql任务需要执行的连接数大于20,超过的连接会被连接池关闭。
}
//获取gorm db对象,其他包需要执行数据库查询的时候,只要通过tools.getDB()获取db对象即可。
//不用担心协程并发使用同样的db对象会共用同一个连接,db对象在调用他的方法的时候会从数据库连接池中获取新的连接
func GetDB() *gorm.DB {
return _db
}
注意:使用连接池技术后,千万不要使用完db后调用db.Close关闭数据库连接,这样会导致整个数据库连接池关闭,导致连接池没有可用的连接。