// internal/database/database.go package database import ( "fmt" "log" "time" "github.com/example/epay-go/internal/config" "gorm.io/driver/postgres" "gorm.io/gorm" "gorm.io/gorm/logger" ) var DB *gorm.DB func Init() error { cfg := config.Get().Database dsn := fmt.Sprintf( "host=%s port=%d user=%s password=%s dbname=%s sslmode=%s", cfg.Host, cfg.Port, cfg.User, cfg.Password, cfg.DBName, cfg.SSLMode, ) var gormConfig *gorm.Config if config.Get().Server.Mode == "debug" { gormConfig = &gorm.Config{ Logger: logger.Default.LogMode(logger.Info), } } else { gormConfig = &gorm.Config{ Logger: logger.Default.LogMode(logger.Silent), } } var err error DB, err = gorm.Open(postgres.Open(dsn), gormConfig) 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 underlying sql.DB: %w", err) } // 连接池配置 sqlDB.SetMaxIdleConns(10) sqlDB.SetMaxOpenConns(100) sqlDB.SetConnMaxLifetime(time.Hour) log.Println("Database connected successfully") return nil } func Get() *gorm.DB { return DB } func Close() error { sqlDB, err := DB.DB() if err != nil { return err } return sqlDB.Close() }