Query or Sync Data from Postgres

WL

Willy Lulciuc

staff
Tags
postgresneonsupabasemcpiceberglake

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.

Neon
Supabase
PostgreSQL

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.

  1. Add your connection: Paste a postgres:// connection string, or enter your host, database, and credentials.
  2. Name your connection: For example, neon_dev.
  3. Connect: oleander discovers your schemas and tables automatically, and they will appear in the Lake sidebar catalog view.
Add a Postgres connection

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:

sql
SELECT *
FROM neon_dev.public.events
LIMIT 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.

  1. Choose the destination catalog and namespace (for example, oleander.default).
  2. Select a sync schedule: once, hourly, or daily.
  3. Configure parallelism and start the sync.
Sync tables into the Lake

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)

sql
SELECT *
FROM neon_dev.public.events
LIMIT 100;

After (managed Iceberg)

sql
SELECT *
FROM oleander.default.events
LIMIT 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:

text
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_id

Or ask in plain English:

"Sync public.events from neon_dev to the lake every hour."

Start by querying Postgres live, then promote only the tables you want to keep in the lake.