/
main.go
67 lines (59 loc) · 1.5 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package main
import (
"context"
"flag"
"log"
"os"
"strings"
"github.com/jackc/pgx/v5"
"github.com/target/goalert/devtools/pgdump-lite"
)
func main() {
log.SetFlags(log.Lshortfile)
file := flag.String("f", "", "Output file (default is stdout).")
db := flag.String("d", os.Getenv("DBURL"), "DB URL") // use same env var as pg_dump
dataOnly := flag.Bool("a", false, "dump only the data, not the schema")
schemaOnly := flag.Bool("s", false, "dump only the schema, no data")
skip := flag.String("T", "", "skip tables")
flag.Parse()
out := os.Stdout
if *file != "" {
fd, err := os.Create(*file)
if err != nil {
log.Fatalln("ERROR: open output:", err)
}
out = fd
defer fd.Close()
}
ctx := context.Background()
cfg, err := pgx.ParseConfig(*db)
if err != nil {
log.Fatalln("ERROR: invalid db url:", err)
}
cfg.RuntimeParams["client_encoding"] = "UTF8"
conn, err := pgx.ConnectConfig(ctx, cfg)
if err != nil {
log.Fatalln("ERROR: connect:", err)
}
defer conn.Close(ctx)
if !*dataOnly {
s, err := pgdump.DumpSchema(ctx, conn)
if err != nil {
log.Fatalln("ERROR: dump data:", err)
}
_, err = out.WriteString("--\n-- pgdump-lite database dump\n--\n\n")
if err != nil {
log.Fatalln("ERROR: write header:", err)
}
_, err = out.WriteString(s.String())
if err != nil {
log.Fatalln("ERROR: write schema:", err)
}
}
if !*schemaOnly {
err = pgdump.DumpData(ctx, conn, out, strings.Split(*skip, ","))
if err != nil {
log.Fatalln("ERROR: dump data:", err)
}
}
}