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 }