package database import ( "fmt" "log" "time" "gorm.io/driver/postgres" "gorm.io/gorm" "gorm.io/gorm/logger" ) var DB *gorm.DB // Config 数据库配置 type Config struct { Host string Port int User string Password string DBName string SSLMode string TimeZone string } // Init 初始化数据库连接 func Init(config Config) error { dsn := fmt.Sprintf( "host=%s user=%s password=%s dbname=%s port=%d sslmode=%s TimeZone=%s", config.Host, config.User, config.Password, config.DBName, config.Port, config.SSLMode, config.TimeZone, ) var err error DB, err = gorm.Open(postgres.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Info), // 开发环境使用Info,生产环境使用Error NowFunc: func() time.Time { return time.Now().UTC() }, }) if err != nil { return fmt.Errorf("failed to connect to database: %w", err) } // 配置连接池 sqlDB, err := DB.DB() if err != nil { return fmt.Errorf("failed to get sql.DB: %w", err) } // 设置连接池参数 sqlDB.SetMaxIdleConns(10) // 最大空闲连接数 sqlDB.SetMaxOpenConns(100) // 最大打开连接数 sqlDB.SetConnMaxLifetime(time.Hour) // 连接最大生存时间 sqlDB.SetConnMaxIdleTime(10 * time.Minute) // 空闲连接最大生存时间 log.Println("Database connected successfully") return nil } // Close 关闭数据库连接 func Close() error { if DB != nil { sqlDB, err := DB.DB() if err != nil { return err } return sqlDB.Close() } return nil } // GetDB 获取数据库实例 func GetDB() *gorm.DB { return DB } // HealthCheck 健康检查 func HealthCheck() error { if DB == nil { return fmt.Errorf("database is not initialized") } sqlDB, err := DB.DB() if err != nil { return err } return sqlDB.Ping() }