macros - 在 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
级别?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 生产运行连续几天停止,这个过滤器会导致数据丢失。
通常我们会避免这样的模式。相反,我们使用我们现有的模型版本来构建任何截止日期——您可以在此处查看更多示例。
推荐阅读
- c++ - 我应该从上次读取时将相同的提取字符传递给 std::cin.putback() 吗?
- spring-boot - 无法启动组件 [StandardEngine[Catalina].StandardHost[localhost].StandardContext - Tomcat 9
- r - 在dfm对象R中分隔字符
- javascript - 用Ajax以数组格式提交表单,不序列化?
- python - TypeError:无法腌制“_thread.lock”对象 Dask 计算
- python - 类“Bot”的未解析属性引用“voice_client_in”
- r - 如何基于一个条件(is.na)在dplyr中的另一个变量的最小值创建一个新变量?
- angular - 通过 URL 导航时,Ionic 5 / Angular 路由不起作用
- swiftui - 我怎么知道一个滚动视图元素即将离开/进入屏幕,所以我可以创建一个动画
- react-native - 在销毁对象之前取消上传请求会导致 mobx-state-tree throw Cannot modify [dead] 错误