-- 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 %}