You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用sqlfluff+pre-commit遇'dbt_utils'未定义Jinja变量错误求助

解决pre-commit + sqlfluff报错“Undefined jinja template variable: 'dbt_utils'”

方案一:使用sqlfluff的dbt模板器(推荐)

该方案让sqlfluff直接对接dbt项目环境,自动加载dbt_utils等依赖宏,无需手动定义。

  1. 确保pre-commit环境安装对应版本的sqlfluff-templater-dbt
    修改pre-commit-config.yaml,在sqlfluff的hook中指定安装匹配版本的sqlfluff-templater-dbt(版本需与sqlfluff严格一致):

    repos:
      - repo: https://github.com/sqlfluff/sqlfluff
        rev: 3.2.0  # 替换为你使用的sqlfluff版本
        hooks:
          - id: sqlfluff-fix
            additional_dependencies: ['sqlfluff-templater-dbt==3.2.0']
          - id: sqlfluff-lint
            additional_dependencies: ['sqlfluff-templater-dbt==3.2.0']
    
  2. 更新.sqlfluff配置文件
    将模板器切换为dbt,并指定dbt项目路径:

    [sqlfluff]
    dialect = databricks
    templater = dbt
    exclude_rules = structure.column_order
    dbt_project_dir = ./dbt  # 你的dbt项目根目录路径
    
    [sqlfluff:templater:dbt]
    enable = true
    

    删除原有的[sqlfluff:templater:jinja]相关配置。

  3. 重新初始化pre-commit hooks
    执行以下命令清理并重新安装hooks:

    pre-commit clean
    pre-commit install
    

方案二:在jinja模板器中手动定义dbt_utils宏

若不想切换模板器,可在sqlfluff配置中手动添加你用到的dbt_utils宏占位符:

[sqlfluff:templater:jinja:macros]
# 保留已有的dbt基础宏
dbt_ref = {% macro ref(model_ref) %}{{model_ref}}{% endmacro %}
dbt_source = {% macro source(source_name, table) %}{{source_name}}_{{table}}{% endmacro %}
dbt_config = {% macro config() %}{% for k in kwargs %}{% endfor %}{% endmacro %}
dbt_var = {% macro var(variable, default='') %}item{% endmacro %}
dbt_is_incremental = {% macro is_incremental() %}True{% endmacro %}

# 添加你用到的dbt_utils宏占位符
dbt_utils = {% macro generate_surrogate_key(cols) %}placeholder_hash{% endmacro %}

验证

执行命令测试修复效果:

pre-commit run --all-files

内容的提问来源于stack exchange,提问作者pauloutboy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 15:02:31