package main import ( "database/sql" "fmt" "log" "github.com/go-sql-driver/mysql" "reanimator/internal/config" "reanimator/internal/repository/migrate" ) func main() { cfg, err := config.Load() if err != nil { log.Fatalf("load config: %v", err) } if cfg.DatabaseDSN == "" { log.Fatal("DATABASE_DSN is required") } parsed, err := mysql.ParseDSN(cfg.DatabaseDSN) if err != nil { log.Fatalf("parse DATABASE_DSN: %v", err) } if parsed.DBName == "" { log.Fatal("DATABASE_DSN must include database name") } dbName := parsed.DBName adminCfg := *parsed adminCfg.DBName = "" adminDSN := adminCfg.FormatDSN() adminDB, err := sql.Open("mysql", adminDSN) if err != nil { log.Fatalf("open admin connection: %v", err) } defer adminDB.Close() if _, err := adminDB.Exec(fmt.Sprintf("DROP DATABASE IF EXISTS `%s`", dbName)); err != nil { log.Fatalf("drop database: %v", err) } if _, err := adminDB.Exec(fmt.Sprintf("CREATE DATABASE `%s`", dbName)); err != nil { log.Fatalf("create database: %v", err) } appDB, err := sql.Open("mysql", cfg.DatabaseDSN) if err != nil { log.Fatalf("open app database: %v", err) } defer appDB.Close() if err := migrate.EnsureSchema(appDB, cfg.MigrationsDir); err != nil { log.Fatalf("apply schema: %v", err) } log.Printf("database %s has been recreated and initialized", dbName) }