package main import ( "fmt" "log" "regexp" "gorm.io/driver/postgres" "gorm.io/gorm" "github.com/sundynix/pets-be/internal/config" ) var databaseName = regexp.MustCompile(`^[a-zA-Z0-9_-]+$`) // dbinit creates the configured PostgreSQL database once. It does not change other databases. func main() { cfg, err := config.Load() if err != nil { log.Fatal(err) } name := cfg.Postgres.Database if !databaseName.MatchString(name) { log.Fatal("invalid database name") } maintenance := cfg.Postgres maintenance.Database = "postgres" db, err := gorm.Open(postgres.Open(maintenance.DSN()), &gorm.Config{}) if err != nil { log.Fatal(err) } var count int64 if err := db.Raw("SELECT count(*) FROM pg_database WHERE datname = ?", name).Scan(&count).Error; err != nil { log.Fatal(err) } if count > 0 { log.Printf("database %s already exists", name) return } if err := db.Exec(fmt.Sprintf("CREATE DATABASE \"%s\"", name)).Error; err != nil { log.Fatal(err) } log.Printf("created database %s", name) }