dbt_project config-version中宏的用法:2

问题描述

我们的dbt_project.yml文件config-version:1在不同的增量模型中具有两个变量,为此,我们使用一个名为 today()

的宏。
vars:
  start_date: '{{ today(offset_days=-1) }}'
  end_date: '2999-12-31'

在测试向dbt 0.17.2的config-version:2迁移时,我们面临以下问题

Running with dbt=0.17.2
Encountered an error:
Compilation Error
  Could not render {{ today(offset_days=-1) }}: 'today' is undefined

我们在去年年底构建的宏。我相信dbt更改了引用宏变量的方式,但是不确定如何解决这个问题。

-- returns current hour in YYYY-MM-DD-HH format,-- optionally offset by N days (-N or +N) or M hours (-M or +M)
{%- macro current_hour(offset_days=0,offset_hours=0) -%}
  {%- set Now = modules.datetime.datetime.Now(modules.pytz.utc) -%}
  {%- set dt = Now + modules.datetime.timedelta(days=offset_days,hours=offset_hours) -%}
  {{- dt.strftime("%Y-%m-%d-%H") -}}
{%- endmacro -%}

-- returns current day in YYYY-MM-DD format,-- optionally offset by N days (-N or +N) or M hours (-M or +M)
{%- macro today(offset_days=0,offset_hours=0) -%}
  {{- current_hour(offset_days,offset_hours)[0:10] -}}
{%- endmacro -%}

-- accepts a timestamp string and returns a timestamo string
-- formatted like 'YYYY-MM-DD HH24:MI:SS.US',e.g. '2019-11-02 06:11:42.690000'
{%- macro dt_to_utc(ts_string) -%}
  TO_CHAR({{ ts_string }}::TIMESTAMPTZ,'YYYY-MM-DD HH24:MI:SS.US')
{%- endmacro -%}

解决方法

我在本地进行了尝试,并使其起作用。除了上述要检查的内容之外,您还将vars移到了models文件(docs)中与dbt_project.yml相同的级别吗?

models:
  ...

vars:
  start_date: '{{ today(offset_days=-1) }}'
  end_date: '2999-12-31'
  

我真的很惊讶这项工作!变量最适合于硬编码对象,而不是动态对象。

我很好奇-为什么不直接调用宏而不使用变量?

当前:

where created_at >= {{ var('start_date') }}

建议:

where created_at >= {{ today(offset_days=-1) }}

话虽这么说,我的间谍意识在这里有点刺痛-此代码使您的dbt项目成为非等幂的-如果您的dbt生产运行连续几天停止了,则此过滤器将导致数据丢失。

通常,我们避免使用这种模式。相反,我们使用模型的现有版本来构建任何截止日期-您可以查看here的更多示例。

,

嗯,首先想到的是一些基本知识,因为当我移至0.17.2并遇到类似问题时,我并没有进行所有这些更改:

  1. 您是否在dbt_project.yml中列出了您的宏路径?

    例如macro-paths: ["macros"]

  2. 我假设您已将config-version: 2添加到您的dbt_project.yml

  3. 尝试双引号吗? "{{ today(offset_days=-1) }}"

可选:您是否构建了宏“ schema.yml”