github.com/supabase/cli@v1.168.1/internal/db/diff/pgschema.go (about)

     1  package diff
     2  
     3  import (
     4  	"context"
     5  	"database/sql"
     6  	"fmt"
     7  	"strings"
     8  
     9  	"github.com/go-errors/errors"
    10  	pgschema "github.com/stripe/pg-schema-diff/pkg/diff"
    11  )
    12  
    13  func DiffPgSchema(ctx context.Context, source, target string, schema []string) (string, error) {
    14  	dbSrc, err := sql.Open("pgx", source)
    15  	if err != nil {
    16  		return "", errors.Errorf("failed to open source database: %w", err)
    17  	}
    18  	defer dbSrc.Close()
    19  	dbDst, err := sql.Open("pgx", target)
    20  	if err != nil {
    21  		return "", errors.Errorf("failed to open target database: %w", err)
    22  	}
    23  	defer dbDst.Close()
    24  	// Generate DDL based on schema plan
    25  	plan, err := pgschema.Generate(
    26  		ctx,
    27  		dbSrc,
    28  		pgschema.DBSchemaSource(dbDst),
    29  		pgschema.WithDoNotValidatePlan(),
    30  		pgschema.WithIncludeSchemas(schema...),
    31  	)
    32  	if err != nil {
    33  		return "", errors.Errorf("failed to generate plan: %w", err)
    34  	}
    35  	var lines []string
    36  	for _, stat := range plan.Statements {
    37  		for _, harzard := range stat.Hazards {
    38  			lines = append(lines, fmt.Sprintf("-- %s", harzard))
    39  		}
    40  		lines = append(lines, fmt.Sprintf("%s;\n", stat.DDL))
    41  	}
    42  	return fmt.Sprintln(strings.Join(lines, "\n")), nil
    43  }