Chonk, the dadbod-grip mascot

Edit database tables like Vim buffers.

Stage changes. Preview the exact SQL. Apply in one transaction. Postgres, MySQL, SQLite, DuckDB, MotherDuck, Parquet, S3. Every Vim motion works. Nothing installs outside Neovim.

dadbod-grip: schema sidebar, query pad, and editable grid with color-coded mutations
PostgreSQLMySQLSQLiteDuckDBMotherDuckParquet / CSV / S3 / HTTPS

Not just a viewer. A full edit cycle.

Every change stages before it touches the database. Review the SQL. Commit or cancel. This is what makes dadbod-grip different from every other database plugin.

i
Edit
Popup editor opens. Change the value, press Enter to stage.
Color-coded
Teal = update. Red = delete. Green = insert. Nothing has run yet.
gl
Preview SQL
Live float shows the exact DML as you work. No surprises.
a
Apply
All changes run in one BEGIN/COMMIT. Any failure rolls back the batch.
live SQL float (gl)
-- 3 staged changes, waiting for `a` to apply

BEGIN;
UPDATE orders SET status = 'shipped' WHERE id = 42;
DELETE FROM orders WHERE id = 17;
INSERT INTO orders (customer_id, total) VALUES (88, 149.99);
COMMIT;

Three things that change how you work

01

Staging transactions

Stage one change or fifty. The entire batch applies in a single transaction. Any failure rolls it all back. Press u after applying to generate a compensating statement and reverse the commit.

Editing docs →
02

Cross-database federation

Use DuckDB as a hub. Attach Postgres, MySQL, SQLite, MotherDuck, S3 Parquet, or remote HTTPS files. JOIN across all of them in one SQL statement. The results open as a live editable grid.

Federation docs →
03

AI with full schema context

Press A from the grid or gA from the query pad. Describe what you want. The AI receives your full schema including table names, column types, and FK relationships. Works with Anthropic, OpenAI, Gemini, or any local Ollama model.

AI docs →

Everything else

+ Batch-edit selected rows in visual mode
+ Navigate FK relationships with gf / <C-o> back
+ Profile column distributions with sparklines (gR)
+ ER diagram float for all tables and FK relationships (gG)
+ Explain query plans with cost and index suggestions (gx)
+ Filter builder: =, !=, >, <, LIKE, IN, BETWEEN, NULL (gF)
+ Diff two tables by primary key (gD)
+ Export to CSV, TSV, JSON, SQL, Markdown, or Grip Table (gE)
+ Sort stacking with visual indicators (s / S)
+ Open Parquet, CSV, HTTPS, S3 as live tables (:GripOpen)
+ Watch mode: auto-refresh on a timer (gW)
+ Write mode: edits persist back to file on disk (g!)
+ Schema sidebar with PK/FK markers and 1-9 tab views
+ SQL completion in query pad: tables, columns, aliases, federation schemas
+ Save and load named queries (:GripSave / gq)
+ Multi-level undo inside staging, undo of applied transactions

Query three databases in one statement

Attach any combination of databases to a DuckDB session. Every attachment gets a schema prefix. JOIN across them like they are local tables.

-- attach your sources
:GripAttach postgres:dbname=production host=db.internal user=app  prod
:GripAttach sqlite:archive.db  legacy
:GripAttach s3://my-bucket/enrichment.parquet  enrichment

-- then JOIN in the query pad (C-CR to run)
SELECT
  prod.customers.email,
  legacy.orders.total,
  enrichment.data.segment
FROM prod.customers
JOIN legacy.orders ON legacy.orders.customer_id = prod.customers.id
JOIN enrichment.data ON enrichment.data.email = prod.customers.email

One line to install

lazy.nvim
-- always latest stable release
{ "joryeugene/dadbod-grip.nvim", version = "*" }

-- then connect
:GripConnect