package migration import ( "context" "database/sql" "cmroubao/backend-api/migrations" "github.com/pressly/goose/v3" ) type Status struct { Version int64 Applied bool } type Runner struct { provider *goose.Provider } func New(db *sql.DB) (*Runner, error) { provider, err := goose.NewProvider( goose.DialectSQLite3, db, migrations.Files, goose.WithDisableGlobalRegistry(true), ) if err != nil { return nil, err } return &Runner{provider: provider}, nil } func (r *Runner) Up(ctx context.Context) (int, error) { results, err := r.provider.Up(ctx) return len(results), err } func (r *Runner) Down(ctx context.Context) error { _, err := r.provider.Down(ctx) return err } func (r *Runner) Status(ctx context.Context) ([]Status, error) { results, err := r.provider.Status(ctx) if err != nil { return nil, err } statuses := make([]Status, 0, len(results)) for _, result := range results { statuses = append(statuses, Status{ Version: result.Source.Version, Applied: result.State == goose.StateApplied, }) } return statuses, nil }