【问题标题】:testing a single CTE in dbt在 dbt 中测试单个 CTE
【发布时间】:2021-12-22 10:29:44
【问题描述】:

您可以测试单个 CTE 而不是模型吗? 例如,在:

# models/mymodel.sql

with my_cte as (
  {%- set tables = dbt_utils.get_relations_by_pattern('my_schema%', 'prefix%') -%}
  {%- set my_columns = ['my_col1', 'mycol2', 'mycol3',...,]
  {{ dbt_utils.union_relations(relations = tables, include=my_columns ) }}
),

clean_cols as (
  select 
    my_col1::numeric as mycol1,
    coalesce(mycol2, mycol3) as my_coalesced_col23,
    ....
  from my_cte
)

select * from clean_cols

我想测试 mycol2 和 mycol3 是否互斥(我有一个自定义的通用测试)

注意:我需要将这些内容保留在同一个文件中,否则很难通过一长串列来管理正确性。将includeselect 的列全部放在一处遵循rename and recast fields once 的最佳做法并放在一处。

【问题讨论】:

  • 附注你用的是什么数据库?
  • 使用 postrgres

标签: dbt


【解决方案1】:

在您当前的实施中,答案是否定的。但是,如果您使用ephemeral materialization,则完全有可能!在这种情况下,你将你的第一个 CTE 分解成它自己的 .sql 模型,然后像下面这样配置它。这样你可以测试unioner.sql模型,但是当你调用dbt run时,不会有unioner模型,而是将逻辑注入到my_model中的my_cte定义中。

-- models/unioner.sql
{{
  config(
    materialized = 'ephemeral',
    )
}}
{%- set tables = dbt_utils.get_relations_by_pattern('my_schema%', 'prefix%') -%}
{{ dbt_utils.union_relations(relations = tables ) }}
-- models/mymodel.sql

with my_cte as (
  SELECT * FROM {{ ref('unioner') }}
),

clean_cols as (
  select 
    my_col1,
    coalesce(mycol2, mycol3)
    ....
  from my_cte
)

select * from clean_cols

【讨论】:

  • 谢谢,@Anders Swanson,但我真的需要将这些东西保存在同一个文件中。更新了关于为什么的原始问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 2011-02-10
  • 2018-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多