dbt_project config-version:2 中宏的使用
usage of macros in dbt_project config-version:2
我们的 dbt_project.yml 文件 config-version: 1 在不同的增量模型中有两个变量,为此我们使用一个名为 today()[=14 的宏=]
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 -%}
嗯,首先想到的只是一些基础知识,因为我在迁移到 0.17.2 时没有进行所有这些更改并且遇到了一些类似的问题:
您是否在 dbt_project.yml
中列出您的宏路径?
例如。 macro-paths: ["macros"]
我假设你添加了 config-version: 2
到你的 dbt_project.yml
?
试试双引号?
"{{ today(offset_days=-1) }}"
可选:您是否构建了宏“schema.yml”
我在本地试用了这个并且让它工作了。除了上面要检查的内容之外,您是否也将 vars
移动到与 dbt_project.yml
文件 (docs) 中的 models
相同的级别?
models:
...
vars:
start_date: '{{ today(offset_days=-1) }}'
end_date: '2999-12-31'
我真的很惊讶这能奏效!变量最适合 hard-coded 对象而不是动态对象。
我很好奇——为什么不直接调用宏而不是使用变量呢?
当前:
where created_at >= {{ var('start_date') }}
提议:
where created_at >= {{ today(offset_days=-1) }}
话虽如此,我的 spidey-senses 在这里有点刺痛 — 此代码使您的 dbt 项目 non-idempotent — 如果您的 dbt 生产 运行 连续几天停止,此过滤器会导致数据丢失。
通常我们会避免这样的模式。相反,我们使用现有版本的模型来构建任何截止日期——您可以查看更多示例 here。
我们的 dbt_project.yml 文件 config-version: 1 在不同的增量模型中有两个变量,为此我们使用一个名为 today()[=14 的宏=]
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 -%}
嗯,首先想到的只是一些基础知识,因为我在迁移到 0.17.2 时没有进行所有这些更改并且遇到了一些类似的问题:
您是否在
dbt_project.yml
中列出您的宏路径?例如。
macro-paths: ["macros"]
我假设你添加了
config-version: 2
到你的dbt_project.yml
?试试双引号?
"{{ today(offset_days=-1) }}"
可选:您是否构建了宏“schema.yml”
我在本地试用了这个并且让它工作了。除了上面要检查的内容之外,您是否也将 vars
移动到与 dbt_project.yml
文件 (docs) 中的 models
相同的级别?
models:
...
vars:
start_date: '{{ today(offset_days=-1) }}'
end_date: '2999-12-31'
我真的很惊讶这能奏效!变量最适合 hard-coded 对象而不是动态对象。
我很好奇——为什么不直接调用宏而不是使用变量呢?
当前:
where created_at >= {{ var('start_date') }}
提议:
where created_at >= {{ today(offset_days=-1) }}
话虽如此,我的 spidey-senses 在这里有点刺痛 — 此代码使您的 dbt 项目 non-idempotent — 如果您的 dbt 生产 运行 连续几天停止,此过滤器会导致数据丢失。
通常我们会避免这样的模式。相反,我们使用现有版本的模型来构建任何截止日期——您可以查看更多示例 here。