运行 dbt 时出现“目标未定义”错误

Posted

技术标签:

【中文标题】运行 dbt 时出现“目标未定义”错误【英文标题】:"target is undefined" error when running dbt 【发布时间】:2020-02-11 22:45:07 【问题描述】:

我有一个dbt_project.yml 喜欢:


name: rdb
profile: rdb
source-paths: ['models']
version: "0.1"

models:
  rdb:
    schema: cin
    materialized: table
    post-hook: 'grant select on  this  to rer'
    on-run-end: 
        # TODO: fix
        - 'grant usage on schema " target.schema " to rer'

DBT 运行良好。但是使用on-run-end 条目,它会因Compilation Error 'target' is undefined 而失败。注释掉该行后,它可以正常工作。

我犯了一个基本错误吗?谢谢!

【问题讨论】:

【参考方案1】:

你的 post-hook 实际上应该是这样的:

on-run-end:
 - "% for schema in schemas %grant usage on schema  schema  to rer;% endfor %"

on-run-end context 的 dbt 文档详细解释了这一点,但长话短说:因为 dbt 运行可能会触及目标数据库上不同模式中的表,所以没有可以应用的单个 target.schema 值授予声明。相反,上下文为您提供了一个名为schemas 的架构名称列表,您需要循环访问该列表。该列表包含一个或多个元素。

dbt 中的target 是适配器的配置数据,如帐户、用户、端口或架构。 this 是关于正在写入的数据库对象,还包括一个字段schema。最后,on-run-end 上下文提供了模式列表,因此您不必为每个表或视图创建冗余授权语句,而可以为每个模式只创建一个授权。

【讨论】:

【参考方案2】:

我的直觉是你不需要引用 jinja 模板。试试:

on-run-end:
    - 'grant usage on schema  target.schema  to rer'

参考this。

【讨论】:

这也是我的猜测,加上引号,它可能会将 SQL 呈现为 ... on schema "target.schema" to rer 或类似的东西。您需要在此处进行文字替换,因此请省略引号。

以上是关于运行 dbt 时出现“目标未定义”错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 dbt 中运行模型时出现“关系 <y> 的列 <x> 不存在”错误,但在 SQL 客户端中运行时却没有?

运行代码时出现用户定义类型未定义错误

运行生成脚手架命令时出现未定义的方法“组”错误

为啥在运行玩笑测试时出现“未定义:x:y:属性”缺失错误?

在项目目录中运行“npm install”时出现错误“无法读取未定义的属性'0'”

ReferenceError:未定义窗口。当我通过 jest 运行 npm test 进行单元测试时出现此错误