package storage import ( "fmt" "log" "os" "time" "goalfymax-admin/internal/config" "goalfymax-admin/pkg/utils" "gorm.io/driver/postgres" "gorm.io/gorm" "gorm.io/gorm/logger" ) var PG *gorm.DB // InitPostgres 初始化PostgreSQL连接 func InitPostgres(appLogger *utils.Logger) error { cfg := config.GetConfig() pg := cfg.PostgreSQL // 兼容 DSN 或字段拼接 dsn := pg.DSN if dsn == "" { ssl := pg.SSLMode if ssl == "" { ssl = "disable" } dsn = fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=%s TimeZone=UTC", pg.Host, pg.Port, pg.User, pg.Password, pg.DBName, ssl, ) } lw := log.New(os.Stdout, "", log.LstdFlags) gormLogger := logger.New(lw, logger.Config{ SlowThreshold: 200 * time.Millisecond, LogLevel: logger.Info, IgnoreRecordNotFoundError: true, ParameterizedQueries: true, Colorful: false, }) db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{Logger: gormLogger}) if err != nil { return fmt.Errorf("连接PostgreSQL失败: %w", err) } sqlDB, err := db.DB() if err != nil { return fmt.Errorf("获取PostgreSQL实例失败: %w", err) } if pg.MaxOpenConns > 0 { sqlDB.SetMaxOpenConns(pg.MaxOpenConns) } if pg.MaxIdleConns > 0 { sqlDB.SetMaxIdleConns(pg.MaxIdleConns) } if pg.ConnMaxLifetime > 0 { sqlDB.SetConnMaxLifetime(pg.ConnMaxLifetime) } if pg.ConnMaxIdleTime > 0 { sqlDB.SetConnMaxIdleTime(pg.ConnMaxIdleTime) } PG = db return nil } func GetPG() *gorm.DB { return PG }