Nine engines, one connection form
Supporting more than one database is easy until you write your first query. Then every difference between them shows up at once.
Adding a second database engine looks like a small job. Add a driver, add a dropdown, done. It stays easy right up until the first query is generated — and then every difference between the engines arrives at the same time.
Quoting is where it always breaks first
MySQL quotes identifiers with backticks. PostgreSQL uses double quotes. SQL Server uses square brackets.
Get this wrong and it fails in the least helpful way possible: the code appears to work, because most table names do not need quoting at all. It breaks only when a name is reserved, or capitalised, or has a space. So it ships, and it breaks in production on somebody else's schema.
We hit exactly this. Row counts and filters on PostgreSQL were being built with backticks. Simple tables were fine. The pager silently stopped at 100 rows on anything else, and it took a while to connect the symptom to the cause.
The fix was not to patch the failing query. It was to make identifier quoting a per-engine function that every query builder has to call, so writing it by hand is no longer possible.
The other differences you inherit
LIMITversusTOPversusOFFSET/FETCH— three ways to say the same thing- Type systems — PostgreSQL's arrays, ranges,
jsonb, and enums have no MySQL equivalent - Case sensitivity — PostgreSQL folds unquoted names to lowercase; MySQL depends on the filesystem
- Booleans — a real type in one,
TINYINT(1)in another - Schemas — PostgreSQL has schemas inside databases; MySQL treats the two words as synonyms
None of these is hard on its own. All of them at once is what makes multi-engine support real work.
What stayed the same
One New Connection form covers all of them, including SQLite, MSSQL, CockroachDB, and Supabase. The engine picker changes which fields appear; the SSH tunnel section is identical everywhere, because tunnelling has nothing to do with the database at the far end.
The goal was that adding a Postgres server should feel exactly like adding a MySQL one. Everything above is the work required for that sentence to be true.
ProTools

