Skip to main content


The graph context variable contains information about the nodes in your dbt project. Models, sources, tests, and snapshots are all examples of nodes in dbt projects.

Heads up

dbt actively builds the graph variable during the parsing phase of running dbt projects, so some properties of the graph context variable will be missing or incorrect during parsing. Please read the information below carefully to understand how to effectively use this variable.

The graph context variable#


The graph context variable is a dictionary which maps node ids onto dictionary representations of those nodes. A simplified example might look like:

{  "nodes": {    "model.project_name.model_name": {      "config": {"materialized": "table", "sort": "id"},      "tags": ["abc", "123"],      "path": "models/path/to/model_name.sql",      ...    },    ...  },  "sources": {    "source.project_name.snowplow.event": {      "database": "analytics",      "schema": "analytics",      "unique_id": "source.project_name.snowplow.event",      "tags": ["abc", "123"],      "path": "models/path/to/schema.yml",      ...    },    ...  },  "exposures": {    "exposure.my_project.traffic_dashboard": {      "type": "dashboard",      "maturity": "high",      "unique_id": "source.project_name.traffic_dashboard",      "path": "models/path/to/schema.yml",      ...    },    ...  }}

The exact contract for these model and source nodes is not currently documented, but that will change in the future.

Accessing models#

The model entries in the graph dictionary will be incomplete or incorrect during parsing. If accessing the models in your project via the graph variable, be sure to use the execute flag to ensure that this code only executes at run-time and not at parse-time. Do not use the graph variable to build your DAG, as the resulting dbt behavior will be undefined and likely incorrect. Example usage:


/*  Print information about all of the models in the Snowplow package*/
{% if execute %}  {% for node in graph.nodes.values()     | selectattr("resource_type", "equalto", "model")     | selectattr("package_name", "equalto", "snowplow") %}      {% do log(node.unique_id ~ ", materialized: " ~ node.config.materialized, info=true) %}    {% endfor %}{% endif %}
/*  Example output---------------------------------------------------------------model.snowplow.snowplow_id_map, materialized: incrementalmodel.snowplow.snowplow_page_views, materialized: incrementalmodel.snowplow.snowplow_web_events, materialized: incrementalmodel.snowplow.snowplow_web_page_context, materialized: tablemodel.snowplow.snowplow_web_events_scroll_depth, materialized: incrementalmodel.snowplow.snowplow_web_events_time, materialized: incrementalmodel.snowplow.snowplow_web_events_internal_fixed, materialized: ephemeralmodel.snowplow.snowplow_base_web_page_context, materialized: ephemeralmodel.snowplow.snowplow_base_events, materialized: ephemeralmodel.snowplow.snowplow_sessions_tmp, materialized: incrementalmodel.snowplow.snowplow_sessions, materialized: table*/

Accessing sources#

To access the sources in your dbt project programatically, use the sources attribute of the graph object.

Example usage:

/*  Union all of the Snowplow sources defined in the project  which begin with the string "event_"*/
{% set sources = [] -%}{% for node in graph.sources.values() -%}  {%- if'event_') and node.source_name == 'snowplow' -%}    {%- do sources.append(source(node.source_name, -%}  {%- endif -%}{%- endfor %}
select * from (  {%- for source in sources %}    select * from {{ source }} {% if not loop.last %} union all {% endif %}  {% endfor %})
/*  Example compiled SQL---------------------------------------------------------------select * from (  select * from raw.snowplow.event_add_to_cart union all  select * from raw.snowplow.event_remove_from_cart union all  select * from raw.snowplow.event_checkout)*/

Accessing exposures#

To access the sources in your dbt project programatically, use the exposures attribute of the graph object.

Example usage:

{# Include a SQL comment naming all of the exposures that this model feeds into #}
{% set exposures = [] -%}{% for exposure in graph.exposures.values() -%}  {%- if model['unique_id'] in exposure.depends_on.nodes -%}    {%- do exposures.append(exposure) -%}  {%- endif -%}{%- endfor %}
-- HELLO database administrator! Before dropping this view,-- please be aware that doing so will affect:
{% for exposure in exposures %}--   * {{ }} ({{ exposure.type }}){% endfor %}
/*  Example compiled SQL----------------------------------------------------------------- HELLO database administrator! Before dropping this view,-- please be aware that doing so will affect:
--   * our_metrics (dashboard)--   * my_sync (application)*/