refactor: extract db migrations from main to internal/database
This commit is contained in:
@@ -17,56 +17,6 @@ import (
|
|||||||
"malago/internal/templates"
|
"malago/internal/templates"
|
||||||
)
|
)
|
||||||
|
|
||||||
func runMigrations(db *sql.DB) error {
|
|
||||||
// Create migration tracking table
|
|
||||||
_, err := db.Exec(`
|
|
||||||
CREATE TABLE IF NOT EXISTS migration_version (
|
|
||||||
name TEXT PRIMARY KEY,
|
|
||||||
applied_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
||||||
)
|
|
||||||
`)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
migrations := []string{
|
|
||||||
"migrations/001_init.sql",
|
|
||||||
"migrations/002_add_anime_titles.sql",
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, migrationFile := range migrations {
|
|
||||||
// Check if migration already applied
|
|
||||||
var exists int
|
|
||||||
err := db.QueryRow("SELECT COUNT(*) FROM migration_version WHERE name = ?", migrationFile).Scan(&exists)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if exists > 0 {
|
|
||||||
log.Printf("migration %s already applied, skipping", migrationFile)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read and execute migration
|
|
||||||
migrationSQL, err := os.ReadFile(migrationFile)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if _, err := db.Exec(string(migrationSQL)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mark as applied
|
|
||||||
_, err = db.Exec("INSERT INTO migration_version (name) VALUES (?)", migrationFile)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Printf("migration %s applied successfully", migrationFile)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
dbFile := os.Getenv("DATABASE_FILE")
|
dbFile := os.Getenv("DATABASE_FILE")
|
||||||
if dbFile == "" {
|
if dbFile == "" {
|
||||||
@@ -80,7 +30,7 @@ func main() {
|
|||||||
defer db.Close()
|
defer db.Close()
|
||||||
|
|
||||||
// Run migrations with tracking
|
// Run migrations with tracking
|
||||||
if err := runMigrations(db); err != nil {
|
if err := database.RunMigrations(db); err != nil {
|
||||||
log.Fatalf("failed to run migrations: %v", err)
|
log.Fatalf("failed to run migrations: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
57
internal/database/migrate.go
Normal file
57
internal/database/migrate.go
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
package database
|
||||||
|
|
||||||
|
import (
|
||||||
|
"database/sql"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
func RunMigrations(db *sql.DB) error {
|
||||||
|
// Create migration tracking table
|
||||||
|
_, err := db.Exec(`
|
||||||
|
CREATE TABLE IF NOT EXISTS migration_version (
|
||||||
|
name TEXT PRIMARY KEY,
|
||||||
|
applied_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||||||
|
)
|
||||||
|
`)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
migrations := []string{
|
||||||
|
"migrations/001_init.sql",
|
||||||
|
"migrations/002_add_anime_titles.sql",
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, migrationFile := range migrations {
|
||||||
|
// Check if migration already applied
|
||||||
|
var exists int
|
||||||
|
err := db.QueryRow("SELECT COUNT(*) FROM migration_version WHERE name = ?", migrationFile).Scan(&exists)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if exists > 0 {
|
||||||
|
log.Printf("migration %s already applied, skipping", migrationFile)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read and execute migration
|
||||||
|
migrationSQL, err := os.ReadFile(migrationFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, err := db.Exec(string(migrationSQL)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mark as applied
|
||||||
|
_, err = db.Exec("INSERT INTO migration_version (name) VALUES (?)", migrationFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Printf("migration %s applied successfully", migrationFile)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user