从 dbt 模型中提取 ref 和源表

Extracting ref and source tables from a dbt model

我在 dbt 中有一个模型,它使用不同的来源和参考表。所以我的问题是... 是否可以创建一个宏来从模型中提取所有引用表和源表?让我举个例子

我有这个型号:

    select
*

from        {{ ref('x') }}   a
left join   {{ source('landing', 'y') }} ma on a.... = ma....
left join   {{ source('landing', 'z') }} b on a.... = b....

因此,一旦该模型的宏为 运行,我想获取名称或参考表和源表。那可能吗?我想在 dbt 中执行此操作,但如果改用 python 会更好,请告诉我。

谢谢!

-- my_macro.sql

{% macro get_dependencies(model_name) %}
    {% set models = graph.nodes.values() %}

    {% set model = (models | selectattr('name', 'equalto', model_name) | list).pop() %}

    {% do log("sources: ", info=true) %}
    {% set sources = model['sources'] %}
    {% for source in sources %}
    {% do log(source[0] ~ '.' ~ source[1], info=true) %}
    {% endfor %}


    {% do log("refs: ", info=true) %}
    {% set refs = model['refs'] %}
    {% for ref in refs %}
    {% do log(ref[0], info=true) %}
    {% endfor %}

{% endmacro %}

一旦你添加了这个宏,试试这个……

dbt run-operation get_dependencies --args '{model_name: my_model}'

它会吐出来……

sources:
landing.y
landing.z
refs:
x

按照我目前的编写方式,它会写出任何重复的来源或模型。例如如果您在多个位置有 {{ ref('x') }},那么它会写出很多次。

refs:
x
x
x

我使用以下关于图形变量的文档将其拼凑在一起。

https://docs.getdbt.com/reference/dbt-jinja-functions/graph

编辑:

这是获取唯一的来源和参考文献列表的方法。它不是最漂亮的,但它确实有效。 (必须有更好的方法来获得一个独特的列表!)

{% macro get_dependencies(model_name) %}
    {% set models = graph.nodes.values() %}

    {% set model = (models | selectattr('name', 'equalto', model_name) | list).pop() %}
    {% set sources = model['sources'] %}
    {% set refs = model['refs'] %}


    {% do log("sources: ", info=true) %}
    {% set unique_sources = [] %}    
    {% for source in sources if source not in unique_sources %}
        {% do unique_sources.append(source) %}
        {% do log(source[0] ~ '.' ~ source[1], info=true) %}
    {% endfor %}

    {% do log("refs: ", info=true) %}
    {% set unique_refs = [] %}    
    {% for ref in refs if reference not in unique_refs %}
        {% do unique_refs.append(ref) %}
        {% do log(ref[0], info=true) %}
    {% endfor %}

{% endmacro %}