Skip to main content

Cross-engine data transformation built on dbt — federate SQL models across any database, warehouse, or bucket

Project description

DVT — Data Virtualization Tool

Any source. Any target. One SQL project.

DVT is a cross-engine data transformation CLI built on dbt. Write SQL models that JOIN tables living on different database engines — MySQL with Snowflake, Oracle with PostgreSQL, anything with anything — and DVT handles extraction, federation, and loading automatically.

{{ config(materialized='f_table') }}   -- "f" = federated

select
    c.customer_name,
    o.order_date,
    o.total_amount
from {{ source('crm', 'customers') }} c      -- lives on MySQL
join {{ source('erp', 'orders') }} o          -- lives on Snowflake
  on c.customer_id = o.customer_id
where o.order_date >= '2024-01-01'
pip install dvt-core
dvt sync       # installs every adapter + driver your profiles.yml needs
dvt run        # dbt runs what dbt can; DVT federates the rest
dvt version    # (worth running once — you'll see)

Website & full docs: getdvt.net · Quickstart · PyPI


Architecture

DVT is a wrapper around stock dbt-core, not a fork. dbt compiles the project and runs every standard model; DVT picks up the models dbt can't express — cross-engine federation models and locally-executed Python models — and runs them through its own pipeline:

                ┌──────────────────────────────────────────────────────────┐
                │                      dvt run / build                     │
                └──────────────────────────────────────────────────────────┘
                                          │
                         dbt compile  ──  manifest.json
                                          │
              ┌───────────────────────────┴───────────────────────────┐
              │                                                       │
      standard models                                        federated models
   (table / view / incremental)                          (f_table / f_incremental
              │                                          / Python models)
              ▼                                                       │
      ┌───────────────┐                 ┌─────────────────────────────┴───────┐
      │   stock dbt   │                 │ 1. DECOMPOSE  — SQLGlot parses the  │
      │  runs them on │                 │    compiled SQL, maps every table   │
      │  the default  │                 │    to a profiles.yml connection     │
      │    target     │                 │ 2. TRANSPILE + PUSH DOWN — minimal  │
      └───────────────┘                 │    per-source queries in each       │
                                        │    engine's own dialect: only the   │
                                        │    columns used, every single-source│
                                        │    filter pushed to the source      │
                                        │ 3. EXTRACT  — Sling streams each    │
                                        │    result to Parquet, in parallel   │
                                        │ 4. COMPUTE  — Parquet loads into a  │
                                        │    local DuckDB cache; the model's  │
                                        │    JOIN/GROUP BY logic runs there   │
                                        │ 5. LOAD     — Sling delivers the    │
                                        │    result to the target: any        │
                                        │    database, warehouse, or cloud    │
                                        │    bucket (as Parquet/CSV objects)  │
                                        └─────────────────────────────────────┘

The Sling direct path (0.2.5)

When every source in an f_table model lives on one connection, steps 3–5 collapse into a single hop: the whole query — joins and aggregations included — is transpiled to that engine's dialect and submitted to Sling as a custom-SQL stream loaded straight to the target. No Parquet staging, no DuckDB. The check is automatic and per-run; any failure falls back to the standard pipeline. Add a source on another engine tomorrow and the same model silently switches to the federation pipeline — the model never changes.

Execution paths

Your model Who runs it How
table / view / incremental stock dbt natively on the default target — whole-query pushdown by definition
f_table / f_incremental, sources on one connection DVT Sling direct: full query pushed to the source engine, result streamed to the target
f_table / f_incremental, sources span connections DVT decompose → per-source pushdown extraction → DuckDB compute → load
.py models DVT locally executed; result loads to any target

Standard models that set a non-default target= are refused with guidance (dbt silently ignores the kwarg — your model would land on the wrong engine).

Design principles

  • Wrapper, not fork. DVT shells out to the dbt CLI and reads manifest.json — it never imports dbt internals. Your dbt version can move; DVT keeps working. Every dbt feature (Jinja, macros, packages, tests, snapshots, docs) works because it is dbt running it.
  • Dual-dialect by design. Federation models are written in DuckDB dialect and are transpiled per source — they never depend on any engine's syntax. Standard models compile in the default target's dialect via the official dbt adapter. Result: switching your default target (e.g. PostgreSQL → Databricks) is a profile change, not a rewrite.
  • Pushdown first. The fastest row to move is the one you never extract. Filters and column pruning push down to source engines; when every table in a model lives on one engine, the entire query pushes down and nothing moves at all.
  • Your hardware does the joining. Cross-engine compute happens in DuckDB on the machine running DVT — source databases only ever serve simple filtered SELECTs, and no warehouse bills you for the join.

What DVT adds on top of dbt

Capability How
Cross-engine models materialized='f_table' / 'f_incremental' (long aliases: federated_*, federation_*)
Incremental federation watermark-based delta extraction; persistent local cache between runs
Per-model targets config(target='other_output') on federated models — results land on any profile output (standard models are refused a foreign target)
Bucket targets materialize models to S3 / GCS / Azure as Parquet or CSV
Python models, locally dbt-style .py models run on your machine (APIs, pandas, ML) — results land on any target
Bulk seeds dvt seed loads csv / tsv / parquet / json / jsonl / avro / arrow / xlsx via Sling to any engine, with enforced snake_case columns
One-command setup dvt sync installs every adapter and driver your profiles.yml requires
Connection diagnostics dvt debug --all checks every connection on both layers (dbt adapter + Sling)
Cross-engine catalog dvt docs builds one catalog + lineage UI across all engines in your project

Everything else — profiles.yml in ~/.dbt/, sources.yml, ref/source/config, tests, snapshots — is standard dbt. Existing dbt projects work unchanged; sources gain an optional meta.connection to bind them to other engines.

Supported engines

Every engine supported by both dbt and Sling is a DVT adapter — as federation source, federation target, seed target, and default target:

PostgreSQL · MySQL · MariaDB · SQL Server · Oracle · SQLite · DuckDB · Snowflake · BigQuery · Redshift · Databricks · ClickHouse · Trino · Athena · Microsoft Fabric — plus S3, GCS, and Azure Blob as bucket storages.

Anything else (MongoDB, Elasticsearch, REST APIs, …) is reachable through locally-executed Python models. Details per adapter: getdvt.net/docs/adapters.

Learn more

License

DVT is distributed as compiled wheels on PyPI. Free tier covers local files, transactional databases, and Python models; Pro adds cloud buckets (S3/GCS/Azure); Max adds cloud warehouses. See getdvt.net/pricing.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

dvt_core-0.2.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (9.8 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

dvt_core-0.2.7-cp312-cp312-macosx_11_0_arm64.whl (1.8 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

dvt_core-0.2.7-cp312-cp312-macosx_10_13_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

dvt_core-0.2.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (10.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

dvt_core-0.2.7-cp311-cp311-macosx_11_0_arm64.whl (1.8 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

dvt_core-0.2.7-cp311-cp311-macosx_10_9_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

dvt_core-0.2.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (9.4 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

dvt_core-0.2.7-cp310-cp310-macosx_11_0_arm64.whl (1.8 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

dvt_core-0.2.7-cp310-cp310-macosx_10_9_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

File details

Details for the file dvt_core-0.2.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for dvt_core-0.2.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b2b39bf457e4cd4f5a9c2c36c8160673288e43821268186ddc12b376c8f67afb
MD5 70326260882223202c71cb71bc6cac2e
BLAKE2b-256 074d465ff1788dea989d0df43364a5f4aed2fc389f17ed0d1f1a729cbae86d48

See more details on using hashes here.

Provenance

The following attestation bundles were made for dvt_core-0.2.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: build-wheels.yml on heshamh96/dvt-core

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dvt_core-0.2.7-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dvt_core-0.2.7-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7146303828f4bd49bd2c663044d5f6801bfe857521d48792017ef18614c85741
MD5 f7e8f01ccfd0f9dacda6ce77f0262503
BLAKE2b-256 c921df762e801014af04a4c23aa8c2a326a404d3f4d478045929aa4f76ff90c9

See more details on using hashes here.

Provenance

The following attestation bundles were made for dvt_core-0.2.7-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: build-wheels.yml on heshamh96/dvt-core

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dvt_core-0.2.7-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for dvt_core-0.2.7-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 36fa0503277bd519e97e89da7aeaff5a377e7dee5c4cc8e44cb3d4e0fc4ca3c8
MD5 b62cd61198d5d2907b75dc47350ff847
BLAKE2b-256 501ed3837d090381ce5564377a65d3badd7aae7d6fe0756b1696d269aaee36fc

See more details on using hashes here.

Provenance

The following attestation bundles were made for dvt_core-0.2.7-cp312-cp312-macosx_10_13_x86_64.whl:

Publisher: build-wheels.yml on heshamh96/dvt-core

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dvt_core-0.2.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for dvt_core-0.2.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 50575a47674192ca1c51733fa5150ed59fbc65bebf78810a393b6465ff246a8d
MD5 093599a88fa7b859575d0161181a9ebf
BLAKE2b-256 da2a4524ce057f65d827402511661d895ef8543fa0e05eff2707b5ea76dd61d7

See more details on using hashes here.

Provenance

The following attestation bundles were made for dvt_core-0.2.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: build-wheels.yml on heshamh96/dvt-core

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dvt_core-0.2.7-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dvt_core-0.2.7-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 50310b7f22ee151e663f53a9741798dcb4719ae500bc374c1f24389c504fc073
MD5 80b85c2bb030a946e3f7c8c94c75e54b
BLAKE2b-256 3ba76f97b4c426c10f3ad0e0856c33c94dd0e6ecf10fadf1246b7ed7b52dc03b

See more details on using hashes here.

Provenance

The following attestation bundles were made for dvt_core-0.2.7-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: build-wheels.yml on heshamh96/dvt-core

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dvt_core-0.2.7-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for dvt_core-0.2.7-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 daf760c062897be3a8f77ec5460f68cfddbd51cb8c262a48597bfbbaba841c00
MD5 67511bb7f0cee50bb40c72dbd0955bbb
BLAKE2b-256 0a93c42a7c6624a58885d369f7f483f39a0e99a06f981d16295ba29a6a20402d

See more details on using hashes here.

Provenance

The following attestation bundles were made for dvt_core-0.2.7-cp311-cp311-macosx_10_9_x86_64.whl:

Publisher: build-wheels.yml on heshamh96/dvt-core

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dvt_core-0.2.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for dvt_core-0.2.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 226c70497f6a56132cd206d0b7d571e0809187b7bc711e5446e112058e82ed83
MD5 4d170664e5f665affe546525dbea8812
BLAKE2b-256 da3fab92fdd3f6180855c92d1bfe97350847873a5aed8c28a08dab999ec60c49

See more details on using hashes here.

Provenance

The following attestation bundles were made for dvt_core-0.2.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: build-wheels.yml on heshamh96/dvt-core

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dvt_core-0.2.7-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dvt_core-0.2.7-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c97b594b2378763bfd0acf09ff9bf74e8c67b688cfb4b82144aaccb5fc7fc1d0
MD5 40d391b43beda1a8ccf2ed55fbc2af1e
BLAKE2b-256 b053428b26493b578f369da86ea12c0e07f3e632bc3fcec85ed7b7f5539c96b4

See more details on using hashes here.

Provenance

The following attestation bundles were made for dvt_core-0.2.7-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: build-wheels.yml on heshamh96/dvt-core

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dvt_core-0.2.7-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for dvt_core-0.2.7-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f066523bf5aa5b67b2b1826bd6a321b2c2723f6b43a7818242901d41c7957dbe
MD5 759cbebe19433c800ee50839e15ba687
BLAKE2b-256 52e9d35d1cc78b00ba1a4d5790d46c2ac8ce614a850acd4242f61b211958b95c

See more details on using hashes here.

Provenance

The following attestation bundles were made for dvt_core-0.2.7-cp310-cp310-macosx_10_9_x86_64.whl:

Publisher: build-wheels.yml on heshamh96/dvt-core

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page