package migrate import ( "database/sql" "fmt" "log" "os" _ "github.com/mattn/go-sqlite3" ) type Migration struct { Version int Name string } func Migrate(db *sql.DB) { migrationTableSql := ` CREATE TABLE IF NOT EXISTS migrations( version INTEGER PRIMARY KEY, name VARCHAR(50) );` _, err := db.Exec(migrationTableSql) if err != nil { log.Fatal(err) } files, err := os.ReadDir("./migrations") if err != nil { log.Fatal("Failed to read migrations directory") } for _, file := range files { fmt.Printf("Checking file: %s\n", file.Name()) var migration Migration row := db.QueryRow("SELECT * FROM migrations WHERE name = ?;", file.Name()) err = row.Scan(&migration.Version, &migration.Name) if err == sql.ErrNoRows { fmt.Printf("Running migration: %s\n", file.Name()) migrationSql, err := os.ReadFile(fmt.Sprintf("./migrations/%s", file.Name())) if err != nil { log.Fatal(err) } _, err = db.Exec(string(migrationSql)) if err != nil { log.Fatal(err) } _, err = db.Exec("INSERT INTO migrations(name) VALUES(?);", file.Name()) if err != nil { log.Fatal(err) } } } }