MCPcopy Index your code
hub / github.com/datnguye/dbterd

github.com/datnguye/dbterd @1.30.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release 1.30.0 ↗ · + Follow
932 symbols 3,544 edges 138 files 466 documented · 50%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README
<h1 style="margin: 0;">dbterd</h1>

Generate ERD-as-a-code from your dbt projects

dbterd logo

Transform your dbt artifact files or metadata into stunning Entity Relationship Diagrams using multiple formats: DBML, Mermaid, PlantUML, GraphViz, D2, DrawDB, and a canonical JSON payload

docs PyPI version python-cli License: MIT python codecov

dbterd stars

🚀 Quick Start

Two ways to get your first ERD on screen — pick whichever matches your mood:

🖱️ Prefer a GUI? Install the dbterd for VS Code extension, open your dbt project, and explore interactive ERDs without touching the command line.

⌨️ Prefer the CLI?

pip install dbterd --upgrade
dbterd run -ad samples/dbtresto

That's it — your diagram is generated. Read on for the full tour.

🎯 Entity Relationship Detection

dbterd intelligently detects entity relationships through three algorithms — pick the one that matches how your dbt project expresses its data contracts:

  • 🧪 Test Relationships (default) — infers relationships from dbt relationships data tests
  • 🏛️ Semantic Entities (-a entity_relationship) — detects relationships via dbt Semantic Layer entity definitions
  • 📜 Model Contract Constraints (-a model_contract) — detects relationships via dbt model contract's foreign_key constraints (dbt 1.9+ / manifest v12+)

For detailed configuration options, see our CLI References.

🎨 Supported Output Formats

No need to pick just one — dbterd has a format for every occasion, from quick GitHub previews to full-blown interactive database designers.

Format Description Use Case
DBML Database Markup Language Interactive web diagrams
Mermaid Markdown-friendly diagrams Documentation, GitHub
PlantUML Text-based UML Technical documentation
GraphViz DOT graph description Complex relationship visualization
D2 Modern diagram scripting Beautiful, customizable diagrams
DrawDB Web-based database designer Interactive database design
JSON Canonical, schema-validated ERD payload Tooling & integrations (VS Code extension, custom apps)

🎯 Try the Quick Demo with DBML format!

🌟 Ecosystem

dbterd plays well with others. These companion projects build on top of it to take your ERDs beyond the command line:

Project What it does
dbdocs An alternative dbt docs site — catalog, ERD, and column-level lineage baked into a single self-contained HTML file.
dbterd-vscode A VS Code extension that turns your dbt project into interactive ERDs without ever leaving your editor, powered by dbterd under the hood.

🚀 Installation

Requires Python 3.10+. dbterd 1.25 was the last release to support Python 3.9; support was dropped since 1.26, as 3.9 reached end-of-life in October 2025 and the dbt 1.11 artifact parser emits X | Y type annotations that won't evaluate on it anyway. If you're still on 3.9, pin dbterd==1.25.* — otherwise upgrade your interpreter (it's worth it).

pip install dbterd --upgrade

Verify Installation:

dbterd --version

[!TIP] For dbt-core users: It's highly recommended to keep artifact-parser updated to the latest version to support newer dbt-core versions and their manifest/catalog json schemas: bash pip install "artifact-parser[dbt]" --upgrade

⚙️ Configuration Files

Tired of typing the same CLI arguments repeatedly? Your fingers deserve better. dbterd supports configuration files to streamline your workflow!

# Initialize a configuration file
dbterd init

# Now just run with your saved settings
dbterd run

Supported formats: - .dbterd.yml - YAML configuration (recommended) - pyproject.toml - Add [tool.dbterd] section to your existing Python project config

Learn more in the Configuration Files Guide.

💡 Examples

CLI Examples

🖱️ Click to explore CLI examples

# 📊 Select all models in dbt_resto
dbterd run -ad samples/dbtresto

# 🎯 Select multiple dbt resources (models + sources)
dbterd run -ad samples/dbtresto -rt model -rt source

# 🔍 Select models excluding staging
dbterd run -ad samples/dbtresto -s model.dbt_resto -ns model.dbt_resto.staging

# 📋 Select by schema name
dbterd run -ad samples/dbtresto -s schema:mart -ns model.dbt_resto.staging

# 🏷️ Select by full schema name
dbterd run -ad samples/dbtresto -s schema:dbt.mart -ns model.dbt_resto.staging

# 🌟 Other sample projects
dbterd run -ad samples/fivetranlog -rt model -rt source
dbterd run -ad samples/facebookad -rt model -rt source
dbterd run -ad samples/shopify -s wildcard:*shopify.shopify__*

# 🔗 Custom relationship detection
dbterd run -ad samples/dbt-constraints -a "test_relationship:(name:foreign_key|c_from:fk_column_name|c_to:pk_column_name)"

# 💻 Your local project
dbterd run -ad samples/local -rt model -rt source

Python API Examples

Generate Complete ERD

from dbterd.api import DbtErd

# Generate DBML format
erd = DbtErd().get_erd()
print("ERD (DBML):", erd)

# Generate Mermaid format
erd = DbtErd(target="mermaid").get_erd()
print("ERD (Mermaid):", erd)

# Generate canonical JSON payload (nodes/edges/metadata)
erd = DbtErd(target="json").get_erd()
print("ERD (JSON):", erd)

Generate Single Model ERD

from dbterd.api import DbtErd

# Get ERD for specific model
dim_prize_erd = DbtErd(target="mermaid").get_model_erd(
    node_unique_id="model.dbt_resto.dim_prize"
)
print("ERD of dim_prize (Mermaid):", dim_prize_erd)

Sample Output:

erDiagram
  "MODEL.DBT_RESTO.DIM_PRIZE" {
    varchar prize_key
    nvarchar prize_name
    int prize_order
  }
  "MODEL.DBT_RESTO.FACT_RESULT" {
    varchar fact_result_key
    varchar box_key
    varchar prize_key
    date date_key
    int no_of_won
    float prize_value
    float prize_paid
    int is_prize_taken
  }
  "MODEL.DBT_RESTO.FACT_RESULT" }|--|| "MODEL.DBT_RESTO.DIM_PRIZE": prize_key

🤝 Contributing

We welcome contributions! Whether you've found a bug, dreamed up a feature, or just want to fix a typo — you're very welcome here.

Ways to contribute: 🐛 Report bugs | 💡 Suggest features | 📝 Improve documentation | 🔧 Submit pull requests

See our Contributing Guide for detailed information.

Show your support: - ⭐ Star this repository - 📢 Share on social media - ✍️ Write a blog post - ☕ Buy me a coffee

buy me a coffee

👥 Contributors

A huge thanks to our amazing contributors — the people who turned "wouldn't it be nice if..." into actual working code. 🙏

📧 Support

Need help? We're here for you! Check 📖 Documentation, 🐛 Report Issues and 💬 Discussions

Star History Chart


Made with ❤️ by the dbterd community


Sponsored by GitAds

Sponsored by GitAds

Core symbols most depended-on inside this repo

get
called by 264
dbterd/plugins/dbt_cloud/administrative.py
get_relationships
called by 32
dbterd/adapters/algos/model_contract.py
invoke
called by 27
dbterd/cli/main.py
run
called by 13
dbterd/core/executor.py
add_section
called by 11
dbterd/core/builder/base_builder.py
build
called by 11
dbterd/core/builder/json_builder.py
load_config
called by 11
dbterd/cli/config.py
filter_tables_based_on_selection
called by 10
dbterd/core/adapters/algo.py

Shape

Method 556
Function 169
Class 143
Route 64

Languages

Python98%
TypeScript2%

Modules by API surface

tests/unit/adapters/algos/test_model_contract.py61 symbols
tests/unit/cli/test_config_loader.py43 symbols
tests/unit/helpers/test_file.py40 symbols
tests/unit/core/test_executor.py29 symbols
dbterd/default.py28 symbols
tests/unit/adapters/algos/__init__.py26 symbols
tests/unit/fixtures/models.py23 symbols
tests/unit/adapters/targets/json/test_json_test_relationship.py23 symbols
tests/unit/adapters/targets/dbml/test_dbml_test_relationship.py22 symbols
tests/unit/core/test_validation_policy.py20 symbols
tests/unit/cli/test_runner.py20 symbols
tests/unit/plugins/dbt_cloud/test_administrative.py19 symbols

For agents

$ claude mcp add dbterd \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact