A configuration-driven and programmatic ETL helper for DuckDB.
Project description
Quackpipe
The missing link between your Python scripts and your data infrastructure.
Quackpipe is a powerful ETL helper library that uses DuckDB to create a unified, high-performance data plane for Python applications. It bridges the gap between writing raw, complex connection code and adopting a full-scale data transformation framework.
With a simple YAML configuration, you can instantly connect to multiple data sources like PostgreSQL, S3, Azure Blob Storage, and SQLite, and even orchestrate complex DuckLake setups, all from a single, clean Python interface.
What Gap Does Quackpipe Fill?
In the modern data stack, you often face a choice:
- Low-Level: Write boilerplate code with multiple database drivers (
psycopg2,boto3, etc.) to connect and move data manually. This is flexible but repetitive and error-prone. - High-Level: Adopt a full DataOps framework like SQLMesh or dbt. These are powerful for building production-grade data warehouses but can be overkill for ad-hoc analysis, rapid prototyping, or simple scripting.
Quackpipe provides the perfect middle ground. It gives you the power of a unified query engine and the simplicity of a Python library, allowing you to:
- Prototype Rapidly: Spin up a multi-source data environment in seconds.
- Simplify ETL Scripts: Replace complex driver code with a single, clean
sessionor a one-linemove_datacommand. - Explore Data Interactively: Use the built-in CLI to launch a web UI with all your sources pre-connected for instant ad-hoc querying.
- Bridge to Production: Automatically generate configuration for frameworks like SQLMesh when you're ready to graduate from a script to a versioned data model.
Core Capabilities
- Unified Data Access: Query across PostgreSQL, S3, Azure, and SQLite as if they were all schemas in a single database.
- Declarative Configuration: Define all your data sources in one human-readable
config.ymlfile. - Powerful ETL Utilities: Move data between any two configured sources with the
move_data()function. - Programmatic API: Use the
QuackpipeBuilderfor dynamic, on-the-fly connection setups in your code. - Secure Secret Management: Load credentials safely from
.envfiles, keeping them out of your code and configuration. - Interactive UI: Launch an interactive DuckDB web UI with all your sources pre-connected using a single CLI command.
- Framework Integration: Automatically generate a
sqlmesh_config.ymlfile to seamlessly transition your project to a full DataOps framework.
Installation
pip install quackpipe
Install support for the sources you need:
# Example: Install support for Postgres, S3, Azure, and the UI
pip install "quackpipe[postgres,s3,azure,ui]"
Configuration
quackpipe uses a simple config.yml file to define your sources and an .env file to manage your secrets.
config.yml Example
# config.yml
sources:
# A writeable PostgreSQL database.
pg_warehouse:
type: postgres
secret_name: "pg_prod" # See Secret Management section below
read_only: false # Allows writing data back to this source
# An S3 data lake for Parquet files.
s3_datalake:
type: s3
secret_name: "aws_prod"
region: "us-east-1"
# An Azure Blob Storage container.
azure_datalake:
type: azure
provider: connection_string
secret_name: "azure_prod"
# A composite DuckLake source.
my_lake:
type: ducklake
catalog:
type: sqlite
path: "/path/to/lake_catalog.db"
storage:
type: local
path: "/path/to/lake_storage/"
Secret Management with .env
Quackpipe uses a secret_name in the config to refer to a bundle of credentials. These are loaded from an .env file using a simple prefix convention: SECRET_NAME_KEY.
Create an .env file in your project root:
# .env
# Secrets for secret_name: "pg_prod"
PG_PROD_HOST=db.example.com
PG_PROD_USER=myuser
PG_PROD_PASSWORD=mypassword
PG_PROD_DATABASE=production
# Secrets for secret_name: "aws_prod"
AWS_PROD_ACCESS_KEY_ID=YOUR_AWS_ACCESS_KEY
AWS_PROD_SECRET_ACCESS_KEY=YOUR_AWS_SECRET_KEY
# Secrets for secret_name: "azure_prod"
AZURE_PROD_CONNECTION_STRING="DefaultEndpointsProtocol=https..."
Usage Highlights
1. Interactive Querying with session
Need to join a CSV in S3 with a table in Postgres? quackpipe makes it trivial.
import quackpipe
# quackpipe automatically loads your .env file
with quackpipe.session(config_path="config.yml", env_file=".env") as con:
df = con.execute("""
SELECT u.name, o.order_total
FROM pg_warehouse.users u
JOIN read_parquet('s3://my-bucket/orders/*.parquet') o ON u.id = o.user_id
WHERE u.signup_date > '2024-01-01';
""").fetchdf()
print(df.head())
2. One-Line Data Movement with move_data
Archive old records from your production database to your data lake with a single command.
from quackpipe.etl_utils import move_data
move_data(
config_path="config.yml",
env_file=".env",
source_query="SELECT * FROM pg_warehouse.logs WHERE timestamp < '2024-01-01'",
destination_name="s3_datalake",
table_name="logs_archive_2023"
)
3. Instant Data Exploration with the CLI
Launch a web browser UI with all your sources attached and ready for ad-hoc queries.
# This command reads your config.yml and .env file
quackpipe ui
# Or connect to specific sources
quackpipe ui pg_warehouse s3_datalake
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file quackpipe-0.6.1.tar.gz.
File metadata
- Download URL: quackpipe-0.6.1.tar.gz
- Upload date:
- Size: 40.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fdce9884437356e70074d3d960cc47dd5992c620076ddbc4c5bf352f09d61686
|
|
| MD5 |
1052089b8da820c44e53c353a8c8d305
|
|
| BLAKE2b-256 |
d17bfdc69156565591ab0bec1836745028e3f20cf9168f471083cbb3eccdcd1d
|
File details
Details for the file quackpipe-0.6.1-py3-none-any.whl.
File metadata
- Download URL: quackpipe-0.6.1-py3-none-any.whl
- Upload date:
- Size: 32.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4a9e8d11c8c5dc0c54c707adbfd4e67a1ab1ec2ecc678b1a7e4c13dc744ff174
|
|
| MD5 |
dd3f40e2e1cc92882e3328b3fffb9c28
|
|
| BLAKE2b-256 |
57ca809db0840a4af10ee4d19fc54b78f9fa48909defcb77036508c923de17ef
|