todo/internal/migrate/migrate.go

61 lines
1.2 KiB
Go

package migrate
import (
"database/sql"
"embed"
"fmt"
"log"
_ "github.com/mattn/go-sqlite3"
)
//go:embed migrations/*.sql
var migrations embed.FS
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 := migrations.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 := migrations.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)
}
}
}
}