DBT如何基于文件夹结构自动为模型生成自定义schema?
DBT自动基于文件夹生成自定义schema解决方案
1. 自动生成schema实现步骤
你需要的功能完全可以通过重写DBT内置的generate_schema_name宏实现,不需要手动在dbt_project.yml中逐个配置,新增文件夹或模型时会自动适配规则。
宏的实现逻辑是通过模型节点的path属性获取模型相对models目录的路径,拆分后拼接目录层级为schema名称,具体操作如下:
- 在项目的
macros目录下新建文件generate_schema_name.sql - 写入以下宏代码:
{% macro generate_schema_name(custom_schema_name, node) -%} -- 优先使用手动指定的schema(如果模型中配置了的话) {% if custom_schema_name is not none %} {{ return(custom_schema_name | trim) }} {% endif %} -- 获取模型相对路径,示例值:product1/team1/model1.sql {% set model_relative_path = node.path %} -- 拆分路径,去掉末尾的文件名,保留目录层级 {% set path_segments = model_relative_path.split('/')[:-1] %} -- 用下划线拼接目录层级作为schema名 {% set auto_schema = path_segments | join('_') %} -- 若需要拼接target中的默认schema前缀(比如dev环境下生成dev_product1_team1),可替换为下面的返回逻辑 -- {{ return(target.schema ~ '_' ~ auto_schema) }} {{ return(auto_schema) }} {%- endmacro %}
- 配置完成后执行
dbt compile验证,查看target目录下生成的SQL对应schema是否符合预期,确认无误后即可正常运行任务。
该方案会自动适配所有目录结构,比如models/product1/team2/subteam/model3.sql会自动生成product1_team2_subteam的schema,新增目录不需要修改任何配置。
2. 关于Python编写宏的说明
DBT目前不支持使用Python编写宏,宏逻辑只能通过Jinja模板语法实现。你提到的路径处理需求用Jinja内置的字符串、列表处理方法完全可以覆盖,不需要引入Python的os模块。
另外DBT 1.3及以上版本支持的Python模型,仅用于编写数据转换逻辑,不能用于定义宏。
内容的提问来源于stack exchange,提问作者Catazza
相关产品推荐
相关产品推荐

