69 lines
1.7 KiB
Go
69 lines
1.7 KiB
Go
package mysql
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/caarlos0/env/v11"
|
|
"github.com/cloudwego/hertz/pkg/common/hlog"
|
|
"gorm.io/driver/mysql"
|
|
"gorm.io/gorm"
|
|
"gorm.io/gorm/logger"
|
|
"gorm.io/gorm/schema"
|
|
)
|
|
|
|
type Config struct {
|
|
Address string `env:"MYSQL_ADDRESS"`
|
|
User string `env:"MYSQL_USERNAME"`
|
|
Password string `env:"MYSQL_PASSWORD"`
|
|
DBName string `env:"MYSQL_DBNAME"`
|
|
}
|
|
|
|
// InitDB 初始化数据库连接
|
|
func InitDB() *gorm.DB {
|
|
var cfg Config
|
|
if err := env.Parse(&cfg); err != nil {
|
|
hlog.Fatalf("解析数据库环境变量失败: %v", err)
|
|
}
|
|
// 配置日志
|
|
newLogger := logger.New(
|
|
log.New(os.Stdout, "\r\n", log.LstdFlags),
|
|
logger.Config{
|
|
SlowThreshold: time.Second, // 慢SQL阈值
|
|
LogLevel: logger.Warn, // 日志级别
|
|
IgnoreRecordNotFoundError: true, // 忽略记录未找到错误
|
|
Colorful: true, // 彩色输出
|
|
},
|
|
)
|
|
|
|
// 配置GORM
|
|
config := &gorm.Config{
|
|
Logger: newLogger,
|
|
NamingStrategy: schema.NamingStrategy{
|
|
SingularTable: true, // 使用单数表名
|
|
},
|
|
}
|
|
dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", cfg.User, cfg.Password, cfg.Address, cfg.DBName)
|
|
// 连接数据库
|
|
DB, err := gorm.Open(mysql.Open(dsn), config)
|
|
if err != nil {
|
|
hlog.Fatalf("连接数据库失败: %v", err)
|
|
}
|
|
|
|
hlog.Info("数据库连接成功")
|
|
|
|
// 获取底层SQL连接池
|
|
sqlDB, err := DB.DB()
|
|
if err != nil {
|
|
hlog.Fatalf("获取数据库连接池失败: %v", err)
|
|
}
|
|
|
|
// 设置连接池参数
|
|
sqlDB.SetMaxIdleConns(10) // 最大空闲连接数
|
|
sqlDB.SetMaxOpenConns(100) // 最大打开连接数
|
|
sqlDB.SetConnMaxLifetime(time.Hour) // 连接最大生命周期
|
|
return DB
|
|
}
|