使用 Jinja2 操作 DBT 宏中的字符串

问题描述 投票:0回答:1

我正在尝试创建一个 dbt 宏,它可以从宏的参数加载表。当我直接指定输入时,我可以做到这一点,例如:

ref('data_categories')
data_categories
是真实的表名称)。但是,当操作字符串传递给
ref
时,我的问题出现了。下面是我的错误函数和编译时的错误。

    {% macro my_fnc(prefix=None) %}
        
        {% set load_table %}
            {% if prefix is defined %}
                {{ prefix }} ~ '_data_categories'
            {% else %}
                'data_categories'
            {% endif %}
        {% endset %}
    
        {% set sql_statement %}
            select *
            from {{ ref( load_table  ) }}
        {% endset %}
        
       ...

    {% endmacro %}

我的错误:

Model X depends on a node named '
          
              'data_categories'
          
      ' which was not found

因为错误信息不明确,并且有一个符号

'
和空格,我现在的想法是
{{ ref( load_table  ) }}
有问题,因为Jinja无法理解
load_table
的意图我天真的问题:什么是a正确地将我定义的表传递给
ref

jinja2 dbt
1个回答
0
投票

使用块

set
命令会给您带来各种空格、回车等问题。您可以通过将标签声明从
{% ... %}
更改为
{%- ... -%}
来删除空格。但就你而言,我会完全删除块集标签:

    {% macro my_fnc(prefix=None) %}
        
        {% if prefix is defined %}
            {% set load_table = prefix ~ '_data_categories' %}
        {% else %}
            {% set load_table = 'data_categories' %}
        {% endif %}
    
        {% set sql_statement %}
            select *
            from {{ ref( load_table  ) }}
        {% endset %}
        
       ...

    {% endmacro %}
© www.soinside.com 2019 - 2024. All rights reserved.