package database import ( "database/sql" "fmt" "gotemplate/internal/env" "log" "os" "path" "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/database/postgres" _ "github.com/golang-migrate/migrate/v4/source/file" ) func createDB() { dbUser := env.GetRequired("DB_USER") dbPass := env.GetRequired("DB_PASS") dbHost := env.GetRequired("DB_HOST") dbPort := env.GetRequired("DB_PORT") dbName := env.GetRequired("DB_NAME") driver := "postgres" connStr := fmt.Sprintf("%s://%s:%s@%s:%s?sslmode=disable", driver, dbUser, dbPass, dbHost, dbPort) db, err := sql.Open(driver, connStr) if err != nil { log.Fatalf("Error opening database: %v", err) } defer db.Close() result, err := db.Exec(fmt.Sprintf("SELECT 'CREATE DATABASE %s' WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '%s')", dbName, dbName)) if err != nil { log.Fatalf("Error creating database: %v", err) } rows, err := result.RowsAffected() if err != nil { log.Fatal(err) } else if rows == 0 { log.Printf("Database already exists: %s", dbName) } else { log.Printf("Database created: %s", dbName) } } func RunMigrations() { createDB() connStr := createConnectionString() driver := "postgres" db, err := sql.Open(driver, connStr) if err != nil { log.Fatalf("failed to open database: %v", err) } defer db.Close() if err = db.Ping(); err != nil { log.Fatal("Failed to connect to database:", err) } conn, err := postgres.WithInstance(db, &postgres.Config{}) if err != nil { log.Fatal(err) } migPath := "file://" + path.Join(os.Getenv("PWD"), "database/migrations") m, err := migrate.NewWithDatabaseInstance( migPath, driver, conn, ) if err != nil { log.Fatalf("failed to create migrate instance: %v", err) } err = m.Up() if err == migrate.ErrNoChange { log.Println("No changes required") } else if err != nil { log.Fatalf("failed to apply migrations: %v", err) } else { log.Println("Migrations applied successfully!") } }