package db import ( "fmt" "log" "os" "time" "gorm.io/driver/postgres" "gorm.io/gorm" ) func ConnectAndMigrate(models ...interface{}) (*gorm.DB, error) { dsn := fmt.Sprintf( "host=%s user=%s password=%s dbname=%s port=%s sslmode=disable", os.Getenv("DB_HOST"), os.Getenv("DB_USER"), os.Getenv("DB_PASSWORD"), os.Getenv("DB_NAME"), os.Getenv("DB_PORT"), ) var database *gorm.DB var err error for i := 0; i < 10; i++ { database, err = gorm.Open(postgres.Open(dsn), &gorm.Config{}) if err == nil { break } log.Println("Failed to connect to database, retrying...") time.Sleep(2 * time.Second) } if err != nil { return nil, fmt.Errorf("connect database: %w", err) } if err := database.AutoMigrate(models...); err != nil { return nil, fmt.Errorf("auto migrate: %w", err) } return database, nil }