aboutsummaryrefslogtreecommitdiff
path: root/memos/WM-097.txt
blob: 53c1df6772032bfd80cc9d8ea92c7107e8f9b90a (plain) (blame)
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
Document: WM-097                                                 P. Webb
Category: Tutorial                                            2026-06-22

                    How to migrate from Gel to Disc

Abstract

   The hardest part is getting your data out of Gel in a useable format,
   the rest is easy.

Body

   Dumping your Gel database to a format other databases can read
   requires arcane knowledge but don't fret, I've uncovered the
   incantations to free your data!

   ```sh
   gel dump --all --format=dir gel-export
   ```

   You should see something like:

   ```
   Connecting to Gel instance 'INSTANCE' at localhost:PORT...
   Starting dump for database `'DATABASE'`...
     Finished dump for `'DATABASE'`. Total size: 181.67 KiB
   ```

   This will create `gel-export` in your current directory. Take note of
   the instance and database names and the port as you'll need these
   later. Next, grab the password to your database:

   ```sh
   gel instance credentials --insecure-dsn -I INSTANCE
   ```

   You should see something like:

   ```
   gel:///DATABASE?port=PORT&password=PASSWORD&tls_ca_file=%3C...%3E&tls_security=no_host_verification
   ```

   Now we can set some variables to make the last bits pseudo-legible.

   ```sh
   DSN="postgresql://edgedb@localhost:PORT/DATABASE?sslmode=require"
   ```

   ```sh
   export PGPASSWORD="PASSWORD"
   ```

   Perform a raw SQL dump to `gel-export/data.sql`:

   ```sh
   pg_dump \
     "$DSN" --data-only --no-owner --no-privileges \
     > gel-export/data.sql
   ```

   We create a `.tsv` file first, without any escaping that could mangle
   the data.

   ```sh
   psql "$DSN" -At -F $'\t' -c "
     SELECT table_schema, table_name
     FROM information_schema.tables
     WHERE table_schema NOT IN ('information_schema', 'pg_catalog')
   " > gel-export/tables.tsv
   ```

   Create our final export directory:

   ```sh
   mkdir gel-export/data
   ```

   Finally, we render our `.csv`s:

   ```sh
   while IFS=$'\t' read -r schema table; do
     out="${schema}_${table}"
     psql "$DSN" --csv -c "SELECT * FROM \"$schema\".\"$table\"" > "gel-export/data/$out.csv"
   done < gel-export/tables.tsv
   ```

   I'll assume you installed Disc[1] already. Great! You'll need to get
   it setup with your schema. Run that migration!

   ```sh
   disc migrate
   ```

   Next, we'll point Disc at your fresh collection of `.csv`s:

   ```sh
   disc db import ./gel-export/data
   ```

   This SHOULD work; it didn't for me because…

   ```
   ✗ Import failed (transaction rolled back): duplicate key value violates unique constraint "log_pkey"
   ```

   …and that's irrelevant to me. Ignoring conflicts like this is okay.

   ```sh
   disc db import ./gel-export/data --on-conflict skip
   ```

   You'll get an import manifest of what was processed and skipped. For
   me, it was abstract types and (empty) computed links.

   Run `disc serve` and navigate to your database's `/ui` and you should
   see populated objects in the Data tab.

   Voila! Now all you gotta do is update your codebase…unfortunately,
   you've gotta handle that yourself. 🕸️

References

   [1] <https://disc.sh>