feat: use postgres

This commit is contained in:
Ilia Denisov
2026-04-26 20:34:39 +02:00
committed by GitHub
parent 48b0056b49
commit fe829285a6
365 changed files with 29223 additions and 24049 deletions
+53
View File
@@ -0,0 +1,53 @@
package postgres
import (
"context"
"database/sql"
"errors"
"fmt"
"io/fs"
"strings"
"sync"
"github.com/pressly/goose/v3"
)
// gooseMu serialises access to goose's package-level filesystem state so
// concurrent calls to RunMigrations from independent services in the same
// process do not race on goose.SetBaseFS.
var gooseMu sync.Mutex
// RunMigrations applies every pending Up migration found under dir inside fsys
// against db. The PostgreSQL dialect is forced; goose's package-level base FS
// is restored to the OS filesystem on the way out so a second caller in the
// same process is safe.
//
// dir is the path within fsys (use "." when the migration files sit at the
// embed root). The function does not handle Down migrations or partial
// targets — services apply the full forward sequence at startup.
func RunMigrations(ctx context.Context, db *sql.DB, fsys fs.FS, dir string) error {
if db == nil {
return errors.New("run migrations: nil db")
}
if fsys == nil {
return errors.New("run migrations: nil fs")
}
if strings.TrimSpace(dir) == "" {
return errors.New("run migrations: dir must not be empty")
}
gooseMu.Lock()
defer gooseMu.Unlock()
goose.SetBaseFS(fsys)
defer goose.SetBaseFS(nil)
if err := goose.SetDialect("postgres"); err != nil {
return fmt.Errorf("run migrations: set dialect: %w", err)
}
if err := goose.UpContext(ctx, db, dir); err != nil {
return fmt.Errorf("run migrations: %w", err)
}
return nil
}