dbt 宏 - 使用 *args/**kwargs
dbt macro - using *args/**kwargs
有时,我们的表需要将多个列附加在一起以形成唯一键。这可以通过执行以下操作来完成:
select
*,
col1 || "_" || col2 as unique_key
from
my_table
这行得通,但导致多个分析师之间缺乏一致性。
我想利用 pythons *args
(我认为 jinja2 使用 varargs
)特性来创建一个可以接受任意数量参数并在所有参数之间创建唯一键的宏。
理想结果:
select
*,
unique_key(col1, col1, ..., colN)
from
my_table
目前dbt_utils package that does something similar, called surrogate key中有一个宏。它过去只使用可变参数,现在也允许使用列表。
对于可变参数部分,它执行以下操作:
{%- 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 -%}
有时,我们的表需要将多个列附加在一起以形成唯一键。这可以通过执行以下操作来完成:
select
*,
col1 || "_" || col2 as unique_key
from
my_table
这行得通,但导致多个分析师之间缺乏一致性。
我想利用 pythons *args
(我认为 jinja2 使用 varargs
)特性来创建一个可以接受任意数量参数并在所有参数之间创建唯一键的宏。
理想结果:
select
*,
unique_key(col1, col1, ..., colN)
from
my_table
目前dbt_utils package that does something similar, called surrogate key中有一个宏。它过去只使用可变参数,现在也允许使用列表。
对于可变参数部分,它执行以下操作:
{%- 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 -%}