DBT项目同一目标下如何基于子文件夹名参数化配置schema
DBT 按模型子文件夹动态配置 Schema 方案
以下提供两种无需在模型SQL中硬编码schema的实现方式,可根据自身需求选择:
方案1:轻量配置(映射固定时推荐)
直接在项目根目录的dbt_project.yml中按文件夹路径配置schema,无需写额外代码:
models: <替换为你的项目名>: # 对应dbt_project.yml中name字段的取值 model1: +schema: STG_dev model2: +schema: ODS_dev model3: +schema: DWH_dev model4: +schema: FIN_dev
配置后对应文件夹下的所有模型会自动继承该schema配置,不需要单独在模型的config()中声明。
方案2:宏动态生成(映射逻辑复杂时推荐)
如果后续文件夹会新增、或者映射逻辑需要动态调整,可以覆盖dbt原生的generate_schema_name宏实现:
- 在项目的
macros/目录下新建custom_schema.sql文件,写入以下逻辑:
{% macro generate_schema_name(custom_schema_name, node) -%} -- 未匹配到映射时的默认schema,取当前target配置的schema {% set default_schema = target.schema %} -- 提取模型所属的第一级子文件夹名称 {% set model_root_folder = node.path.split('/')[0] %} -- 文件夹与schema的映射表,可按需扩展 {% set folder_schema_mapping = { "model1": "STG_dev", "model2": "ODS_dev", "model3": "DWH_dev", "model4": "FIN_dev" } %} {% if model_root_folder in folder_schema_mapping %} {{ return(folder_schema_mapping[model_root_folder]) }} {% else %} {{ return(default_schema) }} {% endif %} {%- endmacro %}
- 配置完成后执行
dbt compile验证生成的SQL目标schema是否符合预期即可。
内容的提问来源于stack exchange,提问作者Roxana Cepoiu
相关产品推荐
相关产品推荐

