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:
flowchart TB
CLI([dvt run / build]) --> COMPILE["dbt compile → manifest.json"]
COMPILE --> STD["standard models<br/>table · view · incremental"]
COMPILE --> FED["federated models<br/>f_table · f_incremental · .py"]
STD --> DBT["stock dbt executes them<br/>on the default target"]
FED --> HOMO{"all sources on<br/>ONE connection?"}
HOMO -- "yes — Sling direct" --> DIRECT["whole query transpiled to the
source engine, streamed straight
to the target — no staging"]
HOMO -- "no — federation" --> DECOMP["1 · DECOMPOSE — SQLGlot maps every
table to a profiles.yml connection"]
DECOMP --> PUSH["2 · TRANSPILE + PUSH DOWN — minimal
per-source queries, each engine's dialect"]
PUSH --> EXTRACT["3 · EXTRACT — Sling → Parquet, parallel"]
EXTRACT --> COMPUTE["4 · COMPUTE — DuckDB joins locally"]
COMPUTE --> LOAD["5 · LOAD — Sling delivers to any
database, warehouse, or bucket"]
DIRECT --> TARGET[("target")]
LOAD --> TARGET
DBT --> TARGET
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 DVT's four file formats — csv / parquet / json / jsonl — 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
- The federation engine, step by step
- Predicate pushdown deep dive
- Switching the default target (lakehouse portability)
- Pricing & plans
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.
Metadata
Release files for dvt-core 0.2.62
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
Total release size: 208.4 MB
Release files / dvt_core-0.2.62-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
| Download URL | dvt_core-0.2.62-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 11.5 MB |
| Tags | CPython 3.14 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
637c60db8905fed3b8f1cc825f853c64e14067ca9db6e16b8411fe8bbd4792e9
|
|
BLAKE2b-256 checksum How to use checksums |
cca18e801b021bc0306b9d1cf9dc02fd2d13415bdd80b8143a3afa4c8512d482
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.5
|
Release files / dvt_core-0.2.62-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
| Download URL | dvt_core-0.2.62-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 10.7 MB |
| Tags | CPython 3.14 Linux glibc 2.17+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
eda56efb0324fb0803de65db5803d458fa0ec7e6a9935e23aa46a20d0f5217dc
|
|
BLAKE2b-256 checksum How to use checksums |
fc54aad2f6bc7faa73f876f4a4e861ba5245f5ee3bc818e14ffd14dbb97b9e6c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.5
|
Release files / dvt_core-0.2.62-cp314-cp314-macosx_11_0_arm64.whl
| Download URL | dvt_core-0.2.62-cp314-cp314-macosx_11_0_arm64.whl |
|---|---|
| Size | 9.7 MB |
| Tags | CPython 3.14 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
6ce1117be61209d8c70efcc06f8bb56ef9bcee00f39cc876091b128a950ae2c1
|
|
BLAKE2b-256 checksum How to use checksums |
1f73733881ed0dc876adaea1f2f2a1587755d69bea152f96593f1985d8b2ab83
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.5
|
Release files / dvt_core-0.2.62-cp314-cp314-macosx_10_15_x86_64.whl
| Download URL | dvt_core-0.2.62-cp314-cp314-macosx_10_15_x86_64.whl |
|---|---|
| Size | 10.4 MB |
| Tags | CPython 3.14 macOS 10.15+ x86-64 |
|
SHA-256 checksum How to use checksums |
5adf5385d29f521fd82a80f62491a098127bc364dc673b0e0312dc9da1401121
|
|
BLAKE2b-256 checksum How to use checksums |
bb73068557dbc322818d5476b0e235e6452037710f2219906bc7800a5651e1f2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.5
|
Release files / dvt_core-0.2.62-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
| Download URL | dvt_core-0.2.62-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 11.4 MB |
| Tags | CPython 3.13 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
64bd06d8eede2ef45b440d4c42d2a30bcb093b15d00511513b9cd0887aa30576
|
|
BLAKE2b-256 checksum How to use checksums |
47b6b3f4c062060ea27fbd9b70dfec4447ba6402903166ec2ad3262709454fd6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.5
|
Release files / dvt_core-0.2.62-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
| Download URL | dvt_core-0.2.62-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 10.5 MB |
| Tags | CPython 3.13 Linux glibc 2.17+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
791188890d42e93c0c32d1fe57044ee262b66c00c1b5ed83708489590dbfb184
|
|
BLAKE2b-256 checksum How to use checksums |
fca0ed98ede4190750d11793a1fd19fc275a19268eded4dff3148251493ffd3e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.5
|
Release files / dvt_core-0.2.62-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | dvt_core-0.2.62-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 9.6 MB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
3a75f23159dfb177d272569cc804124aa517adb752bd4f34b59ba8e2b7f4f002
|
|
BLAKE2b-256 checksum How to use checksums |
67fd4e1cd1f5ce3b1812df2da96e8c780db6b735be0b1e4edd964888ac29c78a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.5
|
Release files / dvt_core-0.2.62-cp313-cp313-macosx_10_13_x86_64.whl
| Download URL | dvt_core-0.2.62-cp313-cp313-macosx_10_13_x86_64.whl |
|---|---|
| Size | 10.4 MB |
| Tags | CPython 3.13 macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
71def829aefe2df4b74a72fb4ae0a380407197ee3e15060eee1313f9c8fb61f7
|
|
BLAKE2b-256 checksum How to use checksums |
aa6c4a79e319338dc4163ed5650049915c21edfef3735ff1746b80c48fdab346
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.5
|
Release files / dvt_core-0.2.62-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
| Download URL | dvt_core-0.2.62-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 11.4 MB |
| Tags | CPython 3.12 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
7f79eb769751dad77a97800564447d9a0fe67af24486e26142407fcd9ad76c2d
|
|
BLAKE2b-256 checksum How to use checksums |
121155d7927eef5787d960057f65c5a8f8ff63feaa23160e2293bbf11008ce62
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.5
|
Release files / dvt_core-0.2.62-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
| Download URL | dvt_core-0.2.62-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 10.4 MB |
| Tags | CPython 3.12 Linux glibc 2.17+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
c4f9bb033e8eadb4533df8e4d86763e95bea25c5c965f064fac04c35d7e94ea6
|
|
BLAKE2b-256 checksum How to use checksums |
13c454201b0646d02e1809928d7bcbf5b12188369a553d12e9b288a1f4d4ac98
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.5
|
Release files / dvt_core-0.2.62-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | dvt_core-0.2.62-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 9.6 MB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
a4cf599251a974f1a4502127bd28ba0d86ffa2cd6c4239d7afdc8ac7cb4d3e10
|
|
BLAKE2b-256 checksum How to use checksums |
3d10a8859659975bad20ec4a0dd229c926157568521af4fddafc2e4eece92ce9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.5
|
Release files / dvt_core-0.2.62-cp312-cp312-macosx_10_13_x86_64.whl
| Download URL | dvt_core-0.2.62-cp312-cp312-macosx_10_13_x86_64.whl |
|---|---|
| Size | 10.3 MB |
| Tags | CPython 3.12 macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
07825afe3fc9666cbc36a677483376432d31c6e78ccdec79fd2ed24f0ff28f3b
|
|
BLAKE2b-256 checksum How to use checksums |
baee69dd774647f331d8d1a7dbec0d3d1bc4f8585c6c0c7c6397ecb356664c6f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.5
|
Release files / dvt_core-0.2.62-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
| Download URL | dvt_core-0.2.62-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 11.0 MB |
| Tags | CPython 3.11 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
0a516d96b94236ba0b98052f3aec2fce060c90f37866362d6a4881a1864e6a15
|
|
BLAKE2b-256 checksum How to use checksums |
c7676ab44df8909c1c760018e5ed80b95cf5b34008cb12e7b1780995c2389477
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.5
|
Release files / dvt_core-0.2.62-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
| Download URL | dvt_core-0.2.62-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 10.2 MB |
| Tags | CPython 3.11 Linux glibc 2.17+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
e10fa3432de442d84b3e7edcc229fd5c1766b859bcc9de86f1e31b166fe7a13f
|
|
BLAKE2b-256 checksum How to use checksums |
537317ddc324470077a50ccfcb7249d22469e9f9bd741e7be2eec2ca79f64af7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.5
|
Release files / dvt_core-0.2.62-cp311-cp311-macosx_11_0_arm64.whl
| Download URL | dvt_core-0.2.62-cp311-cp311-macosx_11_0_arm64.whl |
|---|---|
| Size | 9.5 MB |
| Tags | CPython 3.11 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
5aa2d17af74fc4eb70b7b82a79d23de17646bf411461ccbdae43ff73e3130f67
|
|
BLAKE2b-256 checksum How to use checksums |
28e16f5c62c64cb23d7269bc3513c6fc8f3dfa2e3fa5dbbf54121016c222b5f8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.5
|
Release files / dvt_core-0.2.62-cp311-cp311-macosx_10_9_x86_64.whl
| Download URL | dvt_core-0.2.62-cp311-cp311-macosx_10_9_x86_64.whl |
|---|---|
| Size | 10.1 MB |
| Tags | CPython 3.11 macOS 10.9+ x86-64 |
|
SHA-256 checksum How to use checksums |
f590babc52c295a878485baf0aecca3060a964608f3b2ac41ac31a682351d9b2
|
|
BLAKE2b-256 checksum How to use checksums |
0d44f19ea906fdb311661fadce58cf9af50ea735f8a79c3c8cc5ac1b80b062fd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.5
|
Release files / dvt_core-0.2.62-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
| Download URL | dvt_core-0.2.62-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 11.4 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
83ccaf7d2cf75aebf756e62809c6a3268e70ebf3a48b7dfb086a9c89c4ff62a0
|
|
BLAKE2b-256 checksum How to use checksums |
618a09e006dafe16e09ef936a574859e59a430c6e0bf5eb5e0a635a6234c8b04
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.5
|
Release files / dvt_core-0.2.62-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
| Download URL | dvt_core-0.2.62-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 10.5 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
64606fbc2a5fb11291f8b6b83633886936d1633d8d36a4722b24b1c6169991e9
|
|
BLAKE2b-256 checksum How to use checksums |
10ef2748b2682ab713ea2842de6e7d3f0f385389549fe0875b541da49c084a2d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.5
|
Release files / dvt_core-0.2.62-cp310-cp310-macosx_11_0_arm64.whl
| Download URL | dvt_core-0.2.62-cp310-cp310-macosx_11_0_arm64.whl |
|---|---|
| Size | 9.8 MB |
| Tags | CPython 3.10 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
e820bfa81b5359d20be9f81aae74de3c6a903a094506a84bc334bfd236296d98
|
|
BLAKE2b-256 checksum How to use checksums |
6e45d9747e96823c62888e3acf374836d999ca0a924127dae8113e295c11f63c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.5
|
Release files / dvt_core-0.2.62-cp310-cp310-macosx_10_9_x86_64.whl
| Download URL | dvt_core-0.2.62-cp310-cp310-macosx_10_9_x86_64.whl |
|---|---|
| Size | 10.2 MB |
| Tags | CPython 3.10 macOS 10.9+ x86-64 |
|
SHA-256 checksum How to use checksums |
5002b050486586223fa7ec08cde2e3bcfce8dd57ffd9dcdcbc40da1c79a602ef
|
|
BLAKE2b-256 checksum How to use checksums |
dee6cd6e4e795cc94d75c63bc3e346f8c091cf763c478b828bf48e2ca2c939ae
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.5
|