package database import ( "fmt" "log" "os" "time" "github.com/Nanqipro/YunQue-Tech-Projects/ai_english_learning/serve/config" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" ) var DB *gorm.DB // InitDatabase 初始化数据库连接 func InitDatabase() { cfg := config.GlobalConfig // 构建DSN dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=True&loc=Local&multiStatements=true", cfg.Database.User, cfg.Database.Password, cfg.Database.Host, cfg.Database.Port, cfg.Database.DBName, cfg.Database.Charset, ) // 配置GORM日志 - 使用自定义logger输出详细的SQL日志 gormLogger := logger.New( log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer logger.Config{ SlowThreshold: time.Second, // 慢SQL阈值 LogLevel: logger.Info, // 日志级别:Info会显示所有SQL IgnoreRecordNotFoundError: true, // 忽略ErrRecordNotFound错误 Colorful: true, // 彩色输出 }, ) // 连接数据库 var err error DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: gormLogger, DisableForeignKeyConstraintWhenMigrating: true, }) if err != nil { log.Fatalf("Failed to connect to database: %v", err) } // 获取底层sql.DB对象进行连接池配置 sqlDB, err := DB.DB() if err != nil { log.Fatalf("Failed to get underlying sql.DB: %v", err) } // 设置连接池参数 sqlDB.SetMaxIdleConns(10) // 最大空闲连接数 sqlDB.SetMaxOpenConns(100) // 最大打开连接数 sqlDB.SetConnMaxLifetime(time.Hour) // 连接最大生存时间 sqlDB.SetConnMaxIdleTime(time.Minute * 30) // 连接最大空闲时间 // 测试连接 if err := sqlDB.Ping(); err != nil { log.Fatalf("Failed to ping database: %v", err) } log.Println("Database connected successfully") } // CloseDatabase 关闭数据库连接 func CloseDatabase() { if DB != nil { sqlDB, err := DB.DB() if err != nil { log.Printf("Failed to get underlying sql.DB: %v", err) return } if err := sqlDB.Close(); err != nil { log.Printf("Failed to close database: %v", err) } } } // GetDB 获取数据库实例 func GetDB() *gorm.DB { return DB }