Skip to content

Import connections from other SQL clients (DBeaver, Beekeeper, TablePlus, DataGrip, Sequel Ace)#393

Draft
debba wants to merge 1 commit into
mainfrom
feat/import-connections-from-sql-clients
Draft

Import connections from other SQL clients (DBeaver, Beekeeper, TablePlus, DataGrip, Sequel Ace)#393
debba wants to merge 1 commit into
mainfrom
feat/import-connections-from-sql-clients

Conversation

@debba

@debba debba commented Jun 29, 2026

Copy link
Copy Markdown
Collaborator

Import connections from other SQL clients

Setting up Tabularis from scratch when you already have a dozen connections configured in another client is tedious, and re-typing hosts/ports/credentials is exactly the kind of friction that makes people bounce off a new tool. This PR adds a one-shot importer that reads connections straight from the SQL clients people are most likely already using.

The importers are ported from TablePro's ForeignApp family, reworked into a single Rust module with a shared trait and a neutral intermediate representation, so adding a sixth client later is mostly "implement the trait".

Supported clients

Client Platforms Passwords Notes
DBeaver macOS / Windows / Linux Reads data-sources.json, decrypts credentials-config.json (AES-128-CBC).
Beekeeper Studio macOS / Windows / Linux Reads the SQLite app.db, decrypts with the per-install .key. Personal workspace only (workspaceId = -1).
TablePlus macOS Reads Connections.plist / ConnectionGroups.plist, pulls passwords from the login Keychain.
DataGrip macOS / Windows / Linux Parses dataSources.xml + sshConfigs.xml (JDBC URLs). Passwords live in the JetBrains credential store and are out of scope for now.
Sequel Ace macOS Reads Favorites.plist, pulls passwords from the login Keychain. MySQL only.

How it works

  1. Discover — each importer reports whether its source app's data is present on disk and a best-effort connection count, so the picker only offers what's actually installed.
  2. Import — the selected importer reads the on-disk config, decrypts/recovers credentials (optional, the user opts in), and returns a driver-neutral ImportEnvelope.
  3. Analyze — the envelope is annotated against the user's existing connections and the set of registered drivers, producing an ImportPreview: duplicates are flagged, and connections whose driver isn't installed are surfaced (e.g. an Oracle connection when the Oracle plugin isn't present) without blocking the rest.
  4. Apply — the preview is converted into Tabularis' existing ExportPayload and merged through the regular import path, so there's a single code path that actually creates connections.

SSH tunnels (password / key auth), SSL config, and connection groups carry over where the source app exposes them. Driver labels are mapped to Tabularis driver ids (postgres, mysql/MariaDB, sqlite, mssql, mongodb, redis, oracle, clickhouse, cockroachdb, redshift, cassandra, bigquery, duckdb, libsql).

Credentials & security

  • Password import is opt-in per import run.
  • Secrets recovered during an import stay Rust-side — they're never serialized to the frontend; only has_password / has_ssh booleans cross the boundary.
  • On macOS, Keychain reads can prompt per item. If the user denies a prompt mid-import the envelope is marked credentials_aborted and the connection is still imported without its password rather than failing the whole run.

Code layout

src-tauri/src/connection_import/
  mod.rs            trait + registry + path helpers
  types.rs          neutral IR (ImportEnvelope / ImportedConnection / ...)
  analyzer.rs       duplicate + driver-availability annotation
  convert.rs        envelope -> ExportPayload
  crypto.rs         AES decryption helpers
  driver_map.rs     source driver label -> Tabularis driver id + default port
  keychain_read.rs  macOS Keychain access
  dbeaver.rs / beekeeper.rs / tableplus.rs / datagrip.rs / sequelace.rs
  datagrip/jdbc.rs  JDBC URL parsing
  importer_tests.rs
src-tauri/src/connection_import_commands.rs   Tauri commands
src/components/modals/ImportFromAppModal.tsx  picker + preview UI
src/types/connectionImport.ts

Entry point in the UI is a new option in the Connections page; the modal walks discover → preview → apply.

Tests

  • Unit tests for driver_map (label → id, default ports) and the importers via importer_tests.rs, using injectable data roots so no real client install is needed.
  • datagrip/jdbc.rs URL parsing is covered.

i18n

New keys added across all 8 locales (en, it, es, de, fr, ja, ru, zh).

Still open / would love eyes on

  • DataGrip password recovery (JetBrains credential store / KeePass c.kdbx) is deliberately left out — worth a follow-up.
  • Path discovery has been tested on a limited set of machines. Real-world testing across OSes and client versions is the main thing I'm after before un-drafting this — especially Windows DBeaver/Beekeeper workspace locations and TablePlus/Sequel Ace Keychain prompts on macOS.
  • Edge cases in older config formats of each client.

Marking as draft until we get some testing coverage from people running these clients in the wild.

Add an import flow that reads saved connections from DBeaver, Beekeeper
Studio, TablePlus, DataGrip and Sequel Ace, plus Tabularis JSON exports.
Each source is parsed into a neutral envelope, credentials are decrypted
or read from the keychain when requested, and a preview lets you resolve
duplicates before merging. Entry point is a dropup next to Add Connection.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant