github.com/supabase/cli@v1.168.1/internal/migration/apply/apply.go (about)

     1  package apply
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"io"
     7  	"os"
     8  	"path/filepath"
     9  
    10  	"github.com/go-errors/errors"
    11  	"github.com/jackc/pgx/v4"
    12  	"github.com/spf13/afero"
    13  	"github.com/supabase/cli/internal/migration/history"
    14  	"github.com/supabase/cli/internal/migration/list"
    15  	"github.com/supabase/cli/internal/migration/repair"
    16  	"github.com/supabase/cli/internal/utils"
    17  )
    18  
    19  func MigrateAndSeed(ctx context.Context, version string, conn *pgx.Conn, fsys afero.Fs) error {
    20  	migrations, err := list.LoadPartialMigrations(version, fsys)
    21  	if err != nil {
    22  		return err
    23  	}
    24  	if err := MigrateUp(ctx, conn, migrations, fsys); err != nil {
    25  		return err
    26  	}
    27  	return SeedDatabase(ctx, conn, fsys)
    28  }
    29  
    30  func SeedDatabase(ctx context.Context, conn *pgx.Conn, fsys afero.Fs) error {
    31  	seed, err := repair.NewMigrationFromFile(utils.SeedDataPath, fsys)
    32  	if errors.Is(err, os.ErrNotExist) {
    33  		return nil
    34  	} else if err != nil {
    35  		return err
    36  	}
    37  	fmt.Fprintln(os.Stderr, "Seeding data "+utils.Bold(utils.SeedDataPath)+"...")
    38  	// Batch seed commands, safe to use statement cache
    39  	return seed.ExecBatchWithCache(ctx, conn)
    40  }
    41  
    42  func MigrateUp(ctx context.Context, conn *pgx.Conn, pending []string, fsys afero.Fs) error {
    43  	if len(pending) > 0 {
    44  		if err := history.CreateMigrationTable(ctx, conn); err != nil {
    45  			return err
    46  		}
    47  	}
    48  	for _, filename := range pending {
    49  		if err := applyMigration(ctx, conn, filename, fsys); err != nil {
    50  			return err
    51  		}
    52  	}
    53  	return nil
    54  }
    55  
    56  func applyMigration(ctx context.Context, conn *pgx.Conn, filename string, fsys afero.Fs) error {
    57  	fmt.Fprintln(os.Stderr, "Applying migration "+utils.Bold(filename)+"...")
    58  	path := filepath.Join(utils.MigrationsDir, filename)
    59  	migration, err := repair.NewMigrationFromFile(path, fsys)
    60  	if err != nil {
    61  		return err
    62  	}
    63  	return migration.ExecBatch(ctx, conn)
    64  }
    65  
    66  func BatchExecDDL(ctx context.Context, conn *pgx.Conn, sql io.Reader) error {
    67  	migration, err := repair.NewMigrationFromReader(sql)
    68  	if err != nil {
    69  		return err
    70  	}
    71  	return migration.ExecBatch(ctx, conn)
    72  }