60 lines
1.3 KiB
Go
60 lines
1.3 KiB
Go
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)
|
|
}
|