package dao import ( "exam_registration/internal/model" "fmt" "github.com/spf13/viper" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "time" ) var DB *gorm.DB func InitMySQL(config *viper.Viper) error { host := config.GetString("database.host") port := config.GetString("database.port") user := config.GetString("database.user") password := config.GetString("database.password") dbname := config.GetString("database.dbname") charset := config.GetString("database.charset") maxIdleConns := config.GetInt("database.max_idle_conns") maxOpenConns := config.GetInt("database.max_open_conns") connMaxLifetime := config.GetInt("database.conn_max_lifetime") dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=True&loc=Local", user, password, host, port, dbname, charset) var err error DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Info), }) if err != nil { return fmt.Errorf("failed to connect database: %w", err) } // 配置连接池 sqlDB, err := DB.DB() if err != nil { return fmt.Errorf("failed to get sql.DB: %w", err) } sqlDB.SetMaxIdleConns(maxIdleConns) sqlDB.SetMaxOpenConns(maxOpenConns) sqlDB.SetConnMaxLifetime(time.Duration(connMaxLifetime) * time.Second) // 自动迁移表结构 err = DB.AutoMigrate( &model.User{}, &model.Exam{}, &model.ExamRegistration{}, &model.ExamNotice{}, &model.ExamScore{}, ) if err != nil { return fmt.Errorf("failed to auto migrate: %w", err) } return nil }