问题描述
我们的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并遇到类似问题时,我并没有进行所有这些更改:
-
您是否在
dbt_project.yml
中列出了您的宏路径?例如
macro-paths: ["macros"]
-
我假设您已将
config-version: 2
添加到您的dbt_project.yml
? -
尝试双引号吗?
"{{ today(offset_days=-1) }}"
可选:您是否构建了宏“ schema.yml”