dbt 部分macro 中namespace的使用简单说明
比如在dbt adapter 中的snapshot_check_all_get_existing_columns 中就使用了namepace 这个对象,以下简单说明下
namespace 对象的作用
实际上就是进行跨scope 的数据共享,因为jinja2 每个block 中的设置的变量是不能跨范围共享,解决方法就是使用namespace
参考使用
{% set ns = namespace(found=false) %}
{% for item in items %}
{% if item.check_something() %}
{% set ns.found = true %}
{% endif %}
* {{ item.title }}
{% endfor %}
Found item having something: {{ ns.found }}
dbt snapshot_check_all_get_existing_columns 内部处理
{% macro snapshot_check_all_get_existing_columns(node, target_exists, check_cols_config) -%}
{%- if not target_exists -%}
{#-- no table yet -> return whatever the query does --#}
{{ return((false, query_columns)) }}
{%- endif -%}
{#-- handle any schema changes --#}
{%- set target_relation = adapter.get_relation(database=node.database, schema=node.schema, identifier=node.alias) -%}
{% if check_cols_config == 'all' %}
{%- set query_columns = get_columns_in_query(node['compiled_code']) -%}
{% elif check_cols_config is iterable and (check_cols_config | length) > 0 %}
{#-- query for proper casing/quoting, to support comparison below --#}
{%- set select_check_cols_from_target -%}
{#-- N.B. The whitespace below is necessary to avoid edge case issue with comments --#}
{#-- See: https://github.com/dbt-labs/dbt-core/issues/6781 --#}
select {{ check_cols_config | join(', ') }} from (
{{ node['compiled_code'] }}
) subq
{%- endset -%}
{% set query_columns = get_columns_in_query(select_check_cols_from_target) %}
{% else %}
{% do exceptions.raise_compiler_error("Invalid value for 'check_cols': " ~ check_cols_config) %}
{% endif %}
{%- set existing_cols = adapter.get_columns_in_relation(target_relation) | map(attribute = 'name') | list -%}
# 定义namespace 实现跨block 功能的复用
{%- set ns = namespace() -%} {#-- handle for-loop scoping with a namespace --#}
{%- set ns.column_added = false -%}
{%- set intersection = [] -%}
{%- for col in query_columns -%}
{%- if col in existing_cols -%}
{%- do intersection.append(adapter.quote(col)) -%}
{%- else -%}
{% set ns.column_added = true %}
{%- endif -%}
{%- endfor -%}
{{ return((ns.column_added, intersection)) }}
{%- endmacro %}
说明
namespace 实际属于jinja2 的特性,只是dbt 使用了此特性而已,所以看到部分dbt macro 使用此定义不应该陌生
参考资料
dbt/include/global_project/macros/materializations/snapshots/strategies.sql
https://jinja.palletsprojects.com/en/3.0.x/templates/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2021-06-14 armeria 构建响应式rpc 优先的微服务框架
2021-06-14 datafuse基于rust 开发的实时数据处理&&dbms分析系统
2021-06-14 gotrue netlify 开源的通用用户管理&&jwt token 工具
2021-06-14 centraldogma ha 配置
2021-06-14 centraldogma 安全配置
2016-06-14 webpack es6支持配置