package core import ( "app/commons/config" "fmt" _ "github.com/go-sql-driver/mysql" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "gorm.io/gorm/schema" "time" ) var db *gorm.DB func MainDb() *gorm.DB { if db == nil { db = gormMysqlByConfig(config.EnvConf().Mysql) } return db } func gormMysqlByConfig(m *config.Mysql) *gorm.DB { dialer := mysql.New(mysql.Config{ DSN: m.Dsn(), // DSN data source name DefaultStringSize: 256, // string 类型字段的默认长度 DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持 DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引 DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列 SkipInitializeWithVersion: false, // 根据版本自动配置 }) db, err := gorm.Open(dialer, gormConfig(m.Prefix, m.Singular)) if err != nil { panic(err) } db.InstanceSet("gorm:table_options", "ENGINE=InnoDB") sqlDB, _ := db.DB() sqlDB.SetConnMaxIdleTime(20 * time.Second) sqlDB.SetConnMaxLifetime(20 * time.Second) sqlDB.SetMaxIdleConns(m.MaxIdleConns) sqlDB.SetMaxOpenConns(m.MaxOpenConns) err = sqlDB.Ping() if err != nil { panic(err) } return db } // Config gorm 自定义配置 func gormConfig(prefix string, singular bool) *gorm.Config { var general config.GeneralDB general = config.EnvConf().Mysql.GeneralDB return &gorm.Config{ Logger: logger.New(NewWriter(general), logger.Config{ SlowThreshold: 200 * time.Millisecond, LogLevel: general.LogLevel(), Colorful: true, IgnoreRecordNotFoundError: true, }), NamingStrategy: schema.NamingStrategy{ TablePrefix: prefix, SingularTable: singular, }, DisableForeignKeyConstraintWhenMigrating: true, } } type Writer struct { config config.GeneralDB writer logger.Writer } func NewWriter(config config.GeneralDB) *Writer { return &Writer{config: config} } // Printf 格式化打印日志 func (c *Writer) Printf(message string, data ...any) { // 当有日志时候均需要输出到控制台 fmt.Printf(message, data...) // 当开启了zap的情况,会打印到日志记录 if c.config.LogZap { switch c.config.LogLevel() { case logger.Silent: Log.Debug(fmt.Sprintf(message, data...)) case logger.Error: Log.Error(fmt.Sprintf(message, data...)) case logger.Warn: Log.Warn(fmt.Sprintf(message, data...)) case logger.Info: Log.Info(fmt.Sprintf(message, data...)) default: Log.Info(fmt.Sprintf(message, data...)) } return } }