aboutsummaryrefslogtreecommitdiff
path: root/memos/WM-097.txt
diff options
context:
space:
mode:
authornetop://ウィビ <paul@webb.page>2026-06-22 11:35:17 -0700
committernetop://ウィビ <paul@webb.page>2026-06-22 11:35:17 -0700
commite584830b1fb06fde3cdb285556c26e0fb242ea2b (patch)
tree2c675b5ec4b5c2bf19089c41f60f7c2f59d9979a /memos/WM-097.txt
parent69e84f7f93f4281fb023afdbfaf259c4ddf18d47 (diff)
downloadblog-e584830b1fb06fde3cdb285556c26e0fb242ea2b.tar.gz
blog-e584830b1fb06fde3cdb285556c26e0fb242ea2b.zip
new posts
Diffstat (limited to 'memos/WM-097.txt')
-rw-r--r--memos/WM-097.txt130
1 files changed, 130 insertions, 0 deletions
diff --git a/memos/WM-097.txt b/memos/WM-097.txt
new file mode 100644
index 0000000..53c1df6
--- /dev/null
+++ b/memos/WM-097.txt
@@ -0,0 +1,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>