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.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (8.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

dvt_core-0.2.5-cp312-cp312-macosx_11_0_arm64.whl (1.7 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

dvt_core-0.2.5-cp312-cp312-macosx_10_13_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

dvt_core-0.2.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (9.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

dvt_core-0.2.5-cp311-cp311-macosx_11_0_arm64.whl (1.7 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

dvt_core-0.2.5-cp311-cp311-macosx_10_9_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

dvt_core-0.2.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (8.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

dvt_core-0.2.5-cp310-cp310-macosx_11_0_arm64.whl (1.7 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

dvt_core-0.2.5-cp310-cp310-macosx_10_9_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

File details

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

File metadata

File hashes

Hashes for dvt_core-0.2.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 612a2207c662c524e428c15736d00856d0004a2af543a30f216692d2a23a5ac9
MD5 ea9927f0200b2d3cb23fb7e88028cf49
BLAKE2b-256 059a6da5bc1d78b8fd503231e7ee3a5a8e68f0a4848280b169c28fe097179931

See more details on using hashes here.

Provenance

The following attestation bundles were made for dvt_core-0.2.5-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.5-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dvt_core-0.2.5-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ad10f4c6438f52a4378828174f50280fa46872f6216259a0ccff9bd13d1108a9
MD5 b95a01e04048a07c95b986d882f7a04d
BLAKE2b-256 fd48cfbf1643dfbc9c2b0c5eccdef272d9935cef5de369e003778307693952f8

See more details on using hashes here.

Provenance

The following attestation bundles were made for dvt_core-0.2.5-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.5-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for dvt_core-0.2.5-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 0094f7e37791092533f5009c55124df927a71c57a0b3574fac843c42f0b13dd7
MD5 b8c82158b4980e105b1b6ab22e20c462
BLAKE2b-256 4fa8b6d3c57ee66f2666ccb380d9d87c03f514593c953aa397b3baad72e817e2

See more details on using hashes here.

Provenance

The following attestation bundles were made for dvt_core-0.2.5-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.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for dvt_core-0.2.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 009c16c17e190890f0e3878395015e3e45cfeee5405104373556d709da1ffbb7
MD5 c501c308a5706f698a836da0caa3d2dd
BLAKE2b-256 833b06c547e63497a50250bbe677cf344a41da4159324bd4b2fd613a1210904f

See more details on using hashes here.

Provenance

The following attestation bundles were made for dvt_core-0.2.5-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.5-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dvt_core-0.2.5-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 34b692c3c6038d839bf8ffa35cbdc1bb7aa67d03e33d8e31961e7aa66c3d33a8
MD5 b08b1800569651771029a47133e2e312
BLAKE2b-256 162538dfc93596c54e249268db99dd12e2a3c9f2a1b75bdfd2d27dcc8f00b00e

See more details on using hashes here.

Provenance

The following attestation bundles were made for dvt_core-0.2.5-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.5-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for dvt_core-0.2.5-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4d2f4b284fece534e6053098d9fc4e851146d8459423af4e5cdfa7edfcbdeb87
MD5 182915e8175a726b9eb3a9b40071ca59
BLAKE2b-256 33037f9d05f56ef95d21d529075f55ac5cf30e79d1ddd9c16f31e00f5a45f4e1

See more details on using hashes here.

Provenance

The following attestation bundles were made for dvt_core-0.2.5-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.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for dvt_core-0.2.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 23d30379d70eb84a4032ef1cdaf676cd70d2c33585c6cca7d184871ac5f674f2
MD5 b58fb31e9d4c00afd985e7d9acfdfb41
BLAKE2b-256 8e4cbe657c367f14c51050b2a625d7a478f65482910f35bb415a721b24a7b1b4

See more details on using hashes here.

Provenance

The following attestation bundles were made for dvt_core-0.2.5-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.5-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dvt_core-0.2.5-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f8056987c0d9e8955d105bc49572d91e420e866b6eb926a0cb2049f39f4e5a85
MD5 b1d3bc42f94d5e1608c996872c83a42d
BLAKE2b-256 76f961e3f2289908eaf3fe724b1c335ea4afc553ebce73a9d4b9113437389560

See more details on using hashes here.

Provenance

The following attestation bundles were made for dvt_core-0.2.5-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.5-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for dvt_core-0.2.5-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 deba59e2b4fdd65dbc8978ae93860b4d4a8c6c28602b59152a8a97a8ee6a8737
MD5 769d0047799837ad965276f98a70a661
BLAKE2b-256 2e1ec7b22664b3a3acd061085b5566f970375aaf4fe6f385ca3e319e7f2d062e

See more details on using hashes here.

Provenance

The following attestation bundles were made for dvt_core-0.2.5-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