Skip to main content

dbt-col-lineage

Know what breaks before you change it. Column-level lineage and change-impact analysis for dbt — answer "what breaks if I change this column?" in seconds, without ever running your warehouse.

Tests PyPI Version PyPI Downloads Python Version License

📖 Documentation  ·  🚀 Live Demo  ·  🐛 Report Bug  ·  💡 Request Feature

dbt-col-lineage — interactive column lineage explorer


"I already have lineage in dbt docs."

You have model-level lineage. When you rename, retype, or drop a single column, the dbt DAG can't tell you which downstream columns, transformations, or dashboards actually break — it only knows model A feeds model B. That's the gap this closes.

dbt docs / DAG dbt-col-lineage
Lineage granularity Model → model Column → column
"What breaks if I change orders.amount?" Guess from the model graph Exact affected columns, models & exposures
Pass-through vs. real logic ✅ flags columns whose SQL actually recomputes the value
Needs a warehouse connection dbt docs serve No — reads artifacts, runs anywhere
Blast-radius check in CI ✅ sticky PR comment + severity gate
Machine-readable for AI agents ✅ one JSON document, built for automation

It reads only your dbt artifacts (manifest.json + catalog.json) and parses the compiled SQL statically with sqlglot. It never connects to your warehouse and never runs dbt models.


Comment the blast radius on every dbt PR

Point it at CI and it posts a sticky comment on the pull request showing exactly what a change breaks — the downstream models, columns, and business-facing exposures (dashboards, apps) it touches — so every reviewer sees the impact before they approve. Optionally fail the check when a change is too risky.

Sticky PR comment showing the column-level blast radius of a change

Add it as a GitHub Action:

# .github/workflows/impact.yml
permissions:
  pull-requests: write        # so the check can post its comment

# ...build base- and head-branch dbt artifacts, then:
- uses: Fszta/dbt-column-lineage@v0
  with:
    manifest: artifacts/head/manifest.json
    catalog: artifacts/head/catalog.json
    base-manifest: artifacts/base/manifest.json
    base-catalog: artifacts/base/catalog.json
    fail-on: none             # start non-blocking; flip to exposures|critical once trusted

How the loop works: a PR opens → CI builds dbt artifacts for the base and PR branches → the action diffs them, traces every affected column, model, and exposure, and posts one sticky comment (found-and-updated via a hidden marker, so re-runs edit the same comment instead of spamming the thread).

The severity gate (fail-on) decides when an impactful change should block the PR:

fail-on Blocks the PR when…
none never — comment only (default, the safe on-ramp)
tests a change provably breaks a dbt test (removes/renames a column a not_null/unique/relationships test still targets) — the objective, false-positive-free level to block on (needs base-manifest)
exposures a change reaches a business-facing exposure (dashboard / app)
critical a downstream column recomputes derived logic (not just a pass-through)
any any downstream column is affected at all

The action also emits step outputs for your own gating/reporting: affected_models, affected_columns, affected_exposures, provable_breaks, verdict (safe/review/block), and tripped_level.

Pin @v0 for updates within the current major (like actions/checkout@v4), or an exact release — @v0.13.0 — for reproducible builds. The action installs the CLI bundled at whichever ref you pin, so the tool always matches the tag. A complete runnable workflow lives at docs/examples/impact-pr-check.yml.


Quick start (local)

pip install dbt-col-lineage

Generate your dbt artifacts once — this is the only step that touches dbt, and it still never connects to your warehouse:

dbt compile          # produces target/manifest.json
dbt docs generate    # produces target/catalog.json (column metadata)

Then explore your column lineage in the browser — no flags needed, it reads target/ by default:

dbt-col-lineage --explore

Open http://127.0.0.1:8000, pick a column, and click Analyze Impact to see the columns that need review, the pass-through columns, and the affected models and exposures. Try the live demo → — no install required.

Impact analysis in the explorer

Works even when manifest.json has no embedded compiled_code (e.g. from dbt parse), as long as target/compiled/** exists — it falls back to the compiled SQL on disk.


Machine-readable output (built for agents & automation)

Emit any column's lineage and downstream impact as a single JSON document — a stable contract you can pipe into an LLM tool call, a CI script, or your own tooling:

dbt-col-lineage --select stg_accounts.account_id+ --format json \
    --manifest target/manifest.json --catalog target/catalog.json

Selector grammar (works for text, json, and dot output):

Selector Meaning
+model.col upstream only (where the value comes from)
model.col+ downstream only (what it feeds)
model.col both directions

The JSON splits upstream/downstream into models, sources, direct_refs, and exposures, plus an impact block summarising the affected models, columns, and exposures. Use --format dot for Graphviz.


Run the impact report locally

The impact command derives the set of changed columns for a branch and reports one consolidated blast radius, ranked by severity: removed > type_changed > logic_changed > added.

# Reliable two-manifest diff (base branch vs. current)
dbt-col-lineage impact \
    --manifest target/manifest.json --catalog target/catalog.json \
    --base-manifest base/manifest.json --base-catalog base/catalog.json

# Git-diff fallback when only one manifest is available
dbt-col-lineage impact --git-base main

It defaults to a human-readable Markdown summary (exposures first, then a blast-radius table); add --format json for the machine-readable report. Add --ci to post the sticky PR comment and apply the --fail-on gate.


Compatibility

Works with any sqlglot dialect via --adapter (auto-detected from your manifest by default). Verified against Snowflake, DuckDB, SQLite, and MS SQL Server / TSQL; on BigQuery, Redshift, Postgres, etc., pass --adapter <dialect> if auto-detection needs a nudge.

Limitations

  • Python models are not supported.
  • Some SQL functions/syntax can't be parsed and cause the affected model to be skipped.

Documentation

Full CLI reference — every flag (--scope-git, --github-token/--repo/--pr-number, the complete impact surface), output formats, and CI recipes — lives at fszta.github.io/dbt-column-lineage.

License

MIT — see LICENSE.

Download files

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

Source Distribution

dbt_col_lineage-0.15.0.tar.gz (227.5 kB view details)

Uploaded Source

Built Distribution

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

dbt_col_lineage-0.15.0-py3-none-any.whl (246.6 kB view details)

Uploaded Python 3

File details

Details for the file dbt_col_lineage-0.15.0.tar.gz.

File metadata

  • Download URL: dbt_col_lineage-0.15.0.tar.gz
  • Upload date:
  • Size: 227.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.1.3 CPython/3.10.21 Linux/6.17.0-1022-azure

File hashes

Hashes for dbt_col_lineage-0.15.0.tar.gz
Algorithm Hash digest
SHA256 ac2db891008cb6a3e72bcfc17881a74090b54eaade810b0e0219c75fd942c3f0
MD5 bd984a556df57b8bc390b6f865fc5199
BLAKE2b-256 dbd6cc7df2a9623c1c79d6e8c8264842eaa1750826a02cf62af13fd704eedd11

See more details on using hashes here.

File details

Details for the file dbt_col_lineage-0.15.0-py3-none-any.whl.

File metadata

  • Download URL: dbt_col_lineage-0.15.0-py3-none-any.whl
  • Upload date:
  • Size: 246.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.1.3 CPython/3.10.21 Linux/6.17.0-1022-azure

File hashes

Hashes for dbt_col_lineage-0.15.0-py3-none-any.whl
Algorithm Hash digest
SHA256 59b78ecb9e5578b4e0e0d4e43abab38c6e00ce3ef2dd4209b676ab1eca518166
MD5 fd7b09c4eb00b11dafdf4ce3e530af48
BLAKE2b-256 a8a3a37f3bd2ef3763f697d17ff48d44063c3e7e111cb4c871d8dc3ac424ba48

See more details on using hashes here.

Release history Release notifications | RSS feed

0.16.1

2 files

0.16.0

2 files

This release

0.15.0 This release

2 files

0.14.0

2 files

0.13.0

2 files

0.12.0

2 files

0.11.0

2 files

0.10.0

2 files

0.9.0

2 files

0.8.0

2 files

0.7.0

2 files

0.6.0

2 files

0.5.0

2 files

0.4.0

2 files

0.3.1

2 files

0.3.0

2 files

0.2.1

2 files

0.2.0

2 files

0.1.1

2 files

Supported by

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