惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
腾讯CDC
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Jina AI
Jina AI
N
Netflix TechBlog - Medium
有赞技术团队
有赞技术团队
博客园 - 【当耐特】
MongoDB | Blog
MongoDB | Blog
P
Proofpoint News Feed
L
LangChain Blog
aimingoo的专栏
aimingoo的专栏
GbyAI
GbyAI
B
Blog
F
Fortinet All Blogs
T
Tailwind CSS Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
G
Google Developers Blog
A
About on SuperTechFans
C
Check Point Blog
Microsoft Security Blog
Microsoft Security Blog
MyScale Blog
MyScale Blog
B
Blog RSS Feed

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
DuckDB, Postgres, and Parquet: when one SQL query becomes...
Dmitry Nariz · 2026-05-13 · via DEV Community

DuckDB changed what counts as a "simple query".

Not long ago, joining data from different places usually meant building some awkward temporary workflow first.

Postgres table here.

Parquet files there.

Some files in S3.

Then came the usual mess: exports, staging tables, notebooks, temporary scripts, local folders with names like final_final_2, and a small amount of shame.

DuckDB made a lot of that feel unnecessary.

It can read Parquet directly, work with object storage through httpfs, and connect to PostgreSQL through the PostgreSQL extension. A lot of work that used to require exports or a small ETL job can now start as plain SQL.

That is the good part.

The annoying part starts after the query works.

The question is no longer only:

Can this engine query the data?

Often the harder question is:

Can this workflow be trusted again next week without rebuilding everything around it?

DuckDB solved a large part of the query engine problem.

The workflow around it is still scattered.

workflow

DuckDB made cross-source SQL practical

The appeal is simple: query data where it already lives.

A database, a file, and object storage no longer have to mean three separate workflows. Instead of moving data first and asking questions later, DuckDB lets you ask the question closer to the source.

For example, the interesting part is not that you can write a query like this:

SELECT
  u.id,
  u.email,
  count(e.event_id) AS event_count
FROM pg_prod.public.users u
JOIN read_parquet('s3://analytics/events/*.parquet') e
  ON e.user_id = u.id
GROUP BY u.id, u.email
ORDER BY event_count DESC;

Enter fullscreen mode Exit fullscreen mode

The interesting part is that this kind of query does not need to start with:

"first, export everything."

No warehouse staging step.

No manual CSV detour.

No throwaway import table.

No small pipeline just to compare two datasets.

At least, not at first.

When the wrapper starts owning the job

The first version is usually innocent.

A small Python script wraps a DuckDB query, loads credentials, attaches a database, reads a few files, and writes the result somewhere.

That is a perfectly reasonable way to explore. Python is fast to change, DuckDB fits naturally into local scripts, and the first useful result arrives quickly.

The problem starts when the wrapper keeps collecting responsibilities.

Now it owns:

quick_test.py
  ├─ credentials
  ├─ S3 paths
  ├─ aliases
  ├─ export logic
  ├─ logging
  ├─ retries
  └─ schedule

Enter fullscreen mode Exit fullscreen mode

Nobody planned to build a pipeline.

But the script quietly became one.

That is usually the point where the query is no longer the problem. The SQL still works. The fragile part is everything needed to run it again with confidence.

Schema inspection is part of that confidence too.

Before trusting a cross-source query, you still need to know which tables exist, what columns are available, what the Parquet file contains, and whether user_id is an integer, UUID, string, or some historical accident with leading zeroes.

A raw script can do all of this eventually.

But now the script is not just running SQL.

It is managing context.

What this looks like in DBConvert Streams

This is the part DBConvert Streams takes out of the script.

One query across three saved sources: MySQL film catalog, S3 Parquet actors, and PostgreSQL rentals/payments.

Instead of hiding the workflow in code, the sources stay visible:

  • database connections
  • file and S3 sources
  • schemas
  • rows
  • query results
  • export or load targets

For example, one query can combine:

  • MySQL film catalog
  • S3 Parquet actor data
  • PostgreSQL rentals and payments

The result is a single table with top-grossing films, rating, rental count, revenue, and cast list.

No export from MySQL.

No staging table for Parquet.

No temporary PostgreSQL import.

No separate script just to glue the sources together.

In a script-first workflow, the SQL is only one piece. The rest is hidden in code: connection strings, credentials, S3 paths, aliases, output location, cleanup logic, and whatever gets added after the query starts being reused.

In DBConvert Streams, those parts live in the workspace instead.

The database connection is saved.

The file or S3 source is visible.

Schemas and rows can be inspected before writing the query.

The SQL still runs through DuckDB, but the surrounding workflow is no longer scattered across a script, a database IDE, and a separate export or migration tool.

The result can also become a source for a Stream.

That matters when the query is not just analysis, but preparation: join data from several places, filter it, validate the shape, and then load the result into another database or file target.

That is the positioning:

DuckDB is the engine. DBConvert Streams is the workspace around the engine.

The goal is not to replace DuckDB.

The goal is to stop turning every useful DuckDB query into a small custom tool that somebody has to maintain.

A simple rule of thumb

Plain DuckDB is enough when the task is local, temporary, and owned by one person.

A workflow layer starts to make sense when the same sources come back again, credentials matter, schemas need to be inspected, or the query result becomes something people depend on.

That is the line to watch.

Not the moment the query becomes complex.

The moment the workflow becomes worth preserving.

DBConvert Streams uses DuckDB as the query engine for cross-source SQL across databases, local files, and S3-compatible storage.

More on the Cross-Database SQL workflow:

https://streams.dbconvert.com/cross-database-sql