Query or Sync Data from Postgres
Willy Lulciuc
For many data teams, analytics still starts in Postgres, whether that's Neon, Supabase, or a managed PostgreSQL instance.
Until now, getting that data into a lake meant maintaining one-off ETL jobs, while agents querying data lacked built-in lineage and an audit trail. Today, we're excited to announce Postgres connection support in oleander.
There are two ways to get started. Query Postgres directly through a live SQL proxy for exploration, or sync tables into oleander so analytical workloads run on your lake instead. No ETL to manage, and no separate stack to understand what ran, when, or what it cost. Sync once, hourly, or daily.
- Works with any Postgres: Neon, Supabase, or self-managed.
- Live SQL proxy: Query instantly with no ETL. On fully managed compute.
- Built-in lineage and cost: An audit trail for every query.
- Sync tables to Iceberg: Keep Postgres tables in sync on your schedule.
Add a Postgres Connection
We've made adding a Postgres connection a simple three-step process under Settings → Lake.
- Add your connection: Paste a
postgres://connection string, or enter your host, database, and credentials. - Name your connection: For example,
neon_dev. - Connect: oleander discovers your schemas and tables automatically, and they will appear in the Lake sidebar catalog view.
Query Live with the SQL Proxy
Once connected, oleander exposes your Postgres database through a live SQL proxy. Your tables are immediately available using the connection.schema.table format:
SELECT *FROM neon_dev.public.eventsLIMIT 100;Ad-hoc queries are executed through DuckDB for low-latency reads. oleander's query routing picks the engine and machine size for you. The same connection.schema.table path works in the Lake SQL editor, through oleander's MCP server, and from agents using the oleander plugin for Claude and Codex.
Sync Tables into the Lake
Live reads are great for exploration. When you need a durable Iceberg copy for heavy joins, lower-cost recurring analytics, or to reduce load on your OLTP database, select a table from the sidebar and choose Import into the Lake.
- Choose the destination catalog and namespace (for example,
oleander.default). - Select a sync schedule: once, hourly, or daily.
- Configure parallelism and start the sync.
One-time syncs copy the entire table from a consistent point-in-time snapshot. Scheduled syncs start immediately, then continue on your chosen cadence. Each subsequent sync is incremental: only new or updated rows are read and applied using the table's primary key.
Once the sync completes, the table becomes a native Iceberg table in your chosen catalog and namespace.
Before (live Postgres)
SELECT *FROM neon_dev.public.eventsLIMIT 100;After (managed Iceberg)
SELECT *FROM oleander.default.eventsLIMIT 100;Start by querying Postgres live. Promote to Iceberg when you're ready. The query pattern stays the same: the only change is the table reference, from connection.schema.table to your managed Iceberg table.
Sync or Query from Your Agent
With the oleander plugin installed for Claude or Codex, the tools are already available. Point your agent at a connected database to list connections, query live, or sync tables into the lake:
postgres_connections_list → List registered databases
query_run → SELECT * FROM neon_dev.public.events
postgres_tables_import → connection: neon_dev source_table: public.events destination_table: oleander.default.events confirm: true
jobs_runs_get → Watch the sync by run_idOr ask in plain English:
"Sync
public.eventsfromneon_devto the lake every hour."
Start by querying Postgres live, then promote only the tables you want to keep in the lake.