dbt 宏 - 使用 *args/**kwargs

Rei*_*ams 3 sql jinja2 snowflake-cloud-data-platform dbt

有时,我们的表需要将多个列附加在一起以形成唯一键。这可以通过执行以下操作来完成:

select
    *,
    col1 || "_" || col2 as unique_key
from 
    my_table
Run Code Online (Sandbox Code Playgroud)

这种方法有效,但导致多个分析师之间缺乏统一性。

我想利用 python *args(我认为 jinja2 使用varargs)功能来制作一个宏,它可以接受任意数量的参数并在所有参数之间创建一个唯一的键。

理想结果:

select
    *,
    unique_key(col1, col1, ..., colN)
from 
    my_table
Run Code Online (Sandbox Code Playgroud)

dyl*_*ker 6

当前dbt_utils包中有一个宏可以执行类似的操作,称为代理键。它过去只使用可变参数,现在也允许使用列表。

对于 varargs 部分,它执行以下操作:

{%- for field in varargs %}
{%- set _ = field_list_xf.append(field) -%}
{%- endfor -%}
Run Code Online (Sandbox Code Playgroud)

然后,您可以join()或迭代该列表来执行您想要的任何操作。对于宏,它执行以下操作:

{%- for field in field_list_xf -%}

    {%- set _ = fields.append(
        "coalesce(cast(" ~ field ~ " as " ~ dbt_utils.type_string() ~ "), '')"
    ) -%}

    {%- if not loop.last %}
        {%- set _ = fields.append("'-'") -%}
    {%- endif -%}

{%- endfor -%}
Run Code Online (Sandbox Code Playgroud)