dbt schema.yml使用Jinja循环定义模型报错问题求助
解决dbt schema.yml批量生成模型的报错问题
1. 修复变量类型错误
报错的直接原因是var('ninv')默认返回字符串类型,直接和整数相加会触发类型错误,必须用|int过滤器转为整数:
models: {% for i in range(1, var('ninv')|int + 1) %} - name: tt{{i}} description: "This table contains sale information" columns: *inv {% endfor %}
(如果不需要生成tt0这类表,循环从1开始更合理)
2. 确保YAML锚点正确定义
你使用的*inv是YAML锚点引用,必须先在schema.yml中定义对应的锚点&inv,两种可行写法如下:
写法一:YAML原生锚点(匹配你的原始写法)
version: 2 # 先定义列结构的锚点 columns_template: &inv - name: col1 description: "Column 1 description" - name: col2 description: "Column 2 description" models: {% for i in range(1, var('ninv')|int + 1) %} - name: tt{{i}} description: "This table contains sale information" columns: *inv {% endfor %}
写法二:Jinja变量转YAML
如果觉得YAML锚点使用受限,也可以用Jinja定义列变量,再转为合法YAML格式:
version: 2 {% set inv_columns = [ {"name": "col1", "description": "Column 1 description"}, {"name": "col2", "description": "Column 2 description"} ] %} models: {% for i in range(1, var('ninv')|int + 1) %} - name: tt{{i}} description: "This table contains sale information" columns: {{ inv_columns | toyaml }} {% endfor %}
3. 验证渲染后的YAML格式
执行dbt compile命令后,前往target/compiled/你的项目名/models/目录查看生成的schema.yml文件,确认渲染后的内容是合法的YAML结构(比如每个模型项缩进正确、锚点引用有效)。
4. 确认变量ninv已配置
两种配置方式二选一:
- 在
dbt_project.yml中固定定义变量:
vars: ninv: 5
- 运行dbt命令时临时传入变量:
dbt run --vars '{"ninv": 5}'
内容的提问来源于stack exchange,提问作者Tài Nguyễn
相关产品推荐
相关产品推荐

