package database import ( "database/sql" "fmt" "log" "path" "queryorchestration/internal/env" "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.GetPanic("DB_USER") dbPass := env.GetPanic("DB_PASS") dbHost := env.GetPanic("DB_HOST") dbPort := env.GetPanic("DB_PORT") dbName := env.GetPanic("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.Panicf("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.Panicf("Error creating database: %v", err) } rows, err := result.RowsAffected() if err != nil { log.Panic(err) } else if rows == 0 { log.Printf("Database already exists: %s", dbName) } else { log.Printf("Database created: %s", dbName) } } func RunMigrations(basePath string) { createDB() connStr := createConnectionString() driver := "postgres" db, err := sql.Open(driver, connStr) if err != nil { log.Panicf("failed to open database: %v", err) } defer db.Close() if err = db.Ping(); err != nil { log.Panic("Failed to connect to database:", err) } conn, err := postgres.WithInstance(db, &postgres.Config{}) if err != nil { log.Panic(err) } migPath := "file://" + path.Join(basePath, "database/migrations") m, err := migrate.NewWithDatabaseInstance( migPath, driver, conn, ) if err != nil { log.Panicf("failed to create migrate instance: %v", err) } err = m.Up() if err == migrate.ErrNoChange { log.Println("No changes required") } else if err != nil { log.Panicf("failed to apply migrations: %v", err) } else { log.Println("Migrations applied successfully!") } }