snippet/mysql/mysql.go

91 lines
1.9 KiB
Go
Raw Normal View History

2021-09-03 01:41:46 +00:00
package mysql
import (
2021-09-03 08:44:20 +00:00
"errors"
2021-09-03 01:41:46 +00:00
"time"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
2022-05-11 12:00:20 +00:00
"gorm.io/gorm/schema"
2021-09-03 01:41:46 +00:00
"gorm.io/plugin/dbresolver"
)
var (
_db *gorm.DB
_conf *Config
)
type Config struct {
ConnString string
ConnMaxLifetime int64 //ConnMaxLifetime 最大连接时间,单位:小时
MaxIdleConns int
MaxOpenConns int
2022-12-19 03:28:02 +00:00
InitTable bool
2021-09-03 01:41:46 +00:00
}
2022-12-19 03:28:02 +00:00
// Init mysql初始化
2021-09-15 14:53:03 +00:00
func Init(config *Config) {
if config == nil {
config = &Config{
2023-09-13 09:27:25 +00:00
MaxIdleConns: 10,
MaxOpenConns: 100,
2021-09-15 14:53:03 +00:00
}
2021-09-03 01:41:46 +00:00
}
2023-09-13 09:27:25 +00:00
if config.ConnString == "" {
config.ConnString = "root:root@tcp(127.0.0.1:3306)/mysql?charset=utf8&parseTime=True&loc=Local"
}
if config.ConnMaxLifetime < 1 {
config.ConnMaxLifetime = 1
}
if config.ConnMaxLifetime > 6 {
config.ConnMaxLifetime = 6
}
if config.MaxIdleConns < 1 {
config.MaxIdleConns = 1
}
if config.MaxIdleConns > 50 {
config.MaxIdleConns = 50
}
if config.MaxOpenConns < 1 {
config.MaxOpenConns = 1
}
if config.MaxOpenConns > 500 {
config.MaxOpenConns = 500
}
2021-09-15 14:53:03 +00:00
_conf = config
2021-09-03 01:41:46 +00:00
}
2022-12-19 03:28:02 +00:00
// New 创建实例
2021-09-03 01:41:46 +00:00
func New() (*gorm.DB, error) {
if _db != nil {
return _db, nil
}
2021-09-03 08:44:20 +00:00
if _conf == nil {
2023-09-13 09:27:25 +00:00
return nil, errors.New("组件未初始化,请执行Init!")
2021-09-03 08:44:20 +00:00
}
var err error
_db, err = gorm.Open(mysql.Open(_conf.ConnString), &gorm.Config{
2021-09-03 01:41:46 +00:00
SkipDefaultTransaction: true,
Logger: logger.Default.LogMode(logger.Silent),
2022-05-11 12:00:20 +00:00
NamingStrategy: schema.NamingStrategy{
SingularTable: true,
},
2021-09-03 01:41:46 +00:00
})
if err != nil {
return nil, err
}
_db.Use(
dbresolver.Register(dbresolver.Config{
Sources: []gorm.Dialector{mysql.Open(_conf.ConnString)},
Replicas: []gorm.Dialector{mysql.Open(_conf.ConnString)},
Policy: dbresolver.RandomPolicy{},
}).SetConnMaxIdleTime(time.Hour).
SetConnMaxLifetime(time.Duration(_conf.ConnMaxLifetime) * time.Hour).
SetMaxIdleConns(_conf.MaxIdleConns).
SetMaxOpenConns(_conf.MaxOpenConns))
return _db, nil
}