运行 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 客户端中运行时却没有?