为什么 DBT 运行的模型没有在 DBT 运行语句中明确定位?

mik*_*lus 2 dbt

我有一个 DBT 项目,主要由雪花外部表视图的模型组成。每个模型视图均由单独的 dbt run 语句同时触发。

dbt run --models model_for_view_1
Run Code Online (Sandbox Code Playgroud)

我在 dbt 项目中还有另一个模型,它具体化为使用这些视图的表。我使用与上面相同的 DBT 运行语句在气流中的单独 DAG 中触发此模型。它不使用将其连接到视图的引用或源语句。

我最近注意到,每当我构建视图模型时,DBT 就会构建这个表模型。我认为这是因为 DBT 推断这是一个引用模型,但经过一些实验(我什至将表模型 SQL 设置为 SELECT 1+1 as column1 之类的东西),它仍然在构建。我已将它放在 dbt 项目中的不同文件夹中,重命名该文件等。没有乐趣。不知道为什么运行其他模型会导致构建这个不相关的模型。与视图模型的唯一联系是它们在数据库中共享相同的架构。是什么触发了这个模型的建立?

tco*_*eer 5

选择语法可能很挑剔,因为选择模型的方法有很多种。来自文档

--select 标志接受一个或多个参数。每个参数可以是以下之一:

  1. 一个包名
  2. 型号名称
  3. 模型目录的完全限定路径
  4. 选择方法(路径:、标签:、配置:、测试类型:、测试名称:)

(请注意,在 v0.21 中--models已重命名,但具有相同的行为)--select--models

所以我的猜测是您的model_for_view_1名称不是唯一的,并且与您的项目(在本例中充当包)或它所在的目录共享。

因此,如果您的项目如下所示:

models
 |- some_name
    |- some_name.sql  # the view
    |- another_name.sql  # the table
Run Code Online (Sandbox Code Playgroud)

dbt run --models some_namesome_name.sql将在和中运行代码another_name.sql,因为它选择名为 的目录some_name

  • 我相信这就是问题所在。该包与视图同名。当我在 dbt run 语句中使用更具选择性的模型路径(例如 packagename.foldername.modelname)时,问题得到了解决。正如你所说,需要小心这些选择器。 (3认同)