使用dbt-utils的run_query宏出现语法错误求助
问题排查:dbt run_query 执行时触发数据库语法错误
问题重现
- 编写的模型代码:
-- models/foo.sql {% if execute %} {% set results = run_query('select 1 as id') %} {% do results.print_table() %} {% endif %}
- 执行后报错:
Database Error in model testcard_id_audit (models/audit/foo.sql) syntax error at or near ")" LINE 13: );
- 所有查询都会触发该错误。
环境版本信息
- dbt版本:
dbt --version Core: - installed: 1.7.10 - latest: 1.7.10 - Up to date! Plugins: - postgres: 1.7.10 - Up to date!
- dbt-utils版本:
- package: dbt-labs/dbt_utils version: 0.9.6
问题原因及解决方案
错误核心原因:模型文件必须输出有效的SQL语句。run_query是dbt编译/执行阶段运行的Jinja函数,但模型本身需要生成可被数据库执行的SQL代码。当前代码仅包含Jinja逻辑,未输出任何SQL,dbt会自动补全空的();,导致PostgreSQL语法报错。
解决方法1:给模型添加有效SQL
在现有Jinja代码后补充一条合法SQL:
-- models/foo.sql {% if execute %} {% set results = run_query('select 1 as id') %} {% do results.print_table() %} {% endif %} -- 必须保留的有效SQL语句 select 1 as dummy;
解决方法2:改用宏实现测试
若仅需测试run_query功能,建议将逻辑放到宏文件中(宏无需强制输出SQL):
-- macros/test_run_query.sql {% macro test_run_query() %} {% if execute %} {% set results = run_query('select 1 as id') %} {% do results.print_table() %} {% endif %} {% endmacro %}
通过命令行执行宏:
dbt run-operation test_run_query
内容的提问来源于stack exchange,提问作者Vincent Claes
相关产品推荐
相关产品推荐

