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.

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.
-- 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;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.
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 →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.
gf / <C-o> backgR)gG)gx)gF)gD)gE)s / S):GripOpen)gW)g!):GripSave / gq)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-- always latest stable release
{ "joryeugene/dadbod-grip.nvim", version = "*" }
-- then connect
:GripConnect