2026-04-27 12:35:03 +09:00
|
|
|
package db
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
2026-04-27 13:23:47 +09:00
|
|
|
"embed"
|
2026-04-27 12:35:03 +09:00
|
|
|
"fmt"
|
2026-04-27 13:23:47 +09:00
|
|
|
"path"
|
|
|
|
|
"sort"
|
2026-04-27 12:35:03 +09:00
|
|
|
|
|
|
|
|
"github.com/jackc/pgx/v5/pgxpool"
|
|
|
|
|
)
|
|
|
|
|
|
2026-04-27 13:23:47 +09:00
|
|
|
//go:embed migrations/*.sql
|
|
|
|
|
var migrationsFS embed.FS
|
2026-04-27 12:35:03 +09:00
|
|
|
|
|
|
|
|
func Migrate(pool *pgxpool.Pool) error {
|
2026-04-27 13:23:47 +09:00
|
|
|
files, err := migrationsFS.ReadDir("migrations")
|
2026-04-27 12:35:03 +09:00
|
|
|
if err != nil {
|
2026-04-27 13:23:47 +09:00
|
|
|
return fmt.Errorf("read migrations dir: %w", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sort.Slice(files, func(i, j int) bool {
|
|
|
|
|
return files[i].Name() < files[j].Name()
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
for _, f := range files {
|
|
|
|
|
if path.Ext(f.Name()) != ".sql" {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
data, err := migrationsFS.ReadFile("migrations/" + f.Name())
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("read migration %s: %w", f.Name(), err)
|
|
|
|
|
}
|
|
|
|
|
if _, err := pool.Exec(context.Background(), string(data)); err != nil {
|
|
|
|
|
return fmt.Errorf("run migration %s: %w", f.Name(), err)
|
|
|
|
|
}
|
2026-04-27 12:35:03 +09:00
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|