standard/internal/dal/init.go
2026-03-28 19:31:44 +08:00

75 lines
1.6 KiB
Go

package dal
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"gorm.io/plugin/dbresolver"
"gitea.micah.com/micah/standard/conf"
"gitea.micah.com/micah/standard/internal/dal/query"
)
var DB *gorm.DB
func Init() {
c := conf.GetConf()
var err error
loggerLevel := getLogLevel(c.MySQL.LogLevel)
if loggerLevel < logger.Silent || loggerLevel > logger.Info {
loggerLevel = logger.Info
}
DB, err = gorm.Open(mysql.Open(c.MySQL.DSN), &gorm.Config{
SkipDefaultTransaction: true,
PrepareStmt: true,
Logger: logger.Default.LogMode(loggerLevel),
})
if err != nil {
panic(fmt.Sprintf("注册 DB DSN 失败, %+v", err))
}
if len(c.MySQL.ReplicasDSN) > 0 {
dialects := make([]gorm.Dialector, len(c.MySQL.ReplicasDSN))
for i, s := range c.MySQL.ReplicasDSN {
dialects[i] = mysql.Open(s)
}
// 注册 DB Resolver 插件
err = DB.Use(dbresolver.Register(dbresolver.Config{
// 主库(写操作)
Sources: []gorm.Dialector{mysql.Open(c.MySQL.DSN)},
// 从库(读操作)
Replicas: dialects,
// 负载均衡策略(默认轮询)
Policy: dbresolver.RandomPolicy{}, // 可选:随机、轮询、加权等
// 自动检查连接健康
TraceResolverMode: true, // 记录解析器日志
}).SetMaxOpenConns(100))
if err != nil {
panic(fmt.Sprintf("注册 DB Resolver 失败, %+v", err))
}
}
query.SetDefault(DB)
}
func getLogLevel(level string) logger.LogLevel {
switch level {
case "info":
return logger.Info
case "warn":
return logger.Warn
case "error":
return logger.Error
default:
return logger.Silent
}
}
func GetDB() *gorm.DB {
return DB
}