dbt宏-使用* args / ** kwargs

问题描述

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

select
    *,col1 || "_" || col2 as unique_key
from 
    my_table

这是可行的,但会导致多个分析师之间缺乏统一性。

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

理想的结果:

select
    *,unique_key(col1,col1,...,colN)
from 
    my_table

解决方法

dbt_utils包中当前有一个宏,它执行类似的操作,称为surrogate key。它曾经只使用varargs,现在还允许一个列表。

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

{%- for field in varargs %}
{%- set _ = field_list_xf.append(field) -%}
{%- endfor -%}

然后您可以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 -%}