Files
ai_english/serve/internal/database/database.go
2025-11-17 13:39:05 +08:00

89 lines
2.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}