DBT 模型:如何从查询中创建变量并在 If 语句中使用它

Posted

技术标签:

【中文标题】DBT 模型:如何从查询中创建变量并在 If 语句中使用它【英文标题】:DBT models: how to create variable from query and use it in the If statement 【发布时间】:2021-11-08 17:12:02 【问题描述】:

我一直试图在我的 SQL 模型中创建变量(由 Select 语句定义,而不是静态变量)但没有成功(试图模仿 SQL 存储过程中的 Declare/Set 语句)。我一直在使用调用语句函数来运行我的语句,然后使用 Set 将我的语句的结果分配给一个变量,但是无论我做什么,我都会收到配置中缺少变量或一些编译错误的错误。

尝试运行以下 IF 语句:

%- call statement(name='get_last_snapshot_date', fetch_result=True) -%
    Select ifnull(max(snapshot_date),'9999-09-09') from my_data_source
%- endcall -%

%- set data_last_snapshot_date = load_result('get_last_snapshot_date') -%
%- set last_snapshot_date = data_last_snapshot_date['data'][0][0] -%

%- call statement(name='get_current_date', fetch_result=True) -%
    Select current_date('GB')
%- endcall -%


%- set data_get_current_date = load_result('get_current_date') -%
%- set current_snapshot_date = data_get_current_date['data'][0][0] -%

% if current_snapshot_date == last_snapshot_date: %
    Delete From my_data_source
    Where snapshot_date = current_snapshot_date
% endif %

给我以下错误:

[2021-11-08 16:48:53,433] pod_launcher.py:149 INFO - Compilation Error in model inventory_hist_test (models/inventory_hist_test.sql)
[2021-11-08 16:48:53,433] pod_launcher.py:149 INFO -  expected token ':', got ''
[2021-11-08 16:48:53,433] pod_launcher.py:149 INFO -    line 29
[2021-11-08 16:48:53,434] pod_launcher.py:149 INFO -      % if  current_snapshot_date  ==  last_snapshot_date  % (edited) 

【问题讨论】:

【参考方案1】:

您遇到的错误是因为您在 if 语句行的末尾缺少 :

此外,一旦您进入 Jinja 街区,您就不需要

试试:

% if current_snapshot_date == last_snapshot_date: %

此外,我认为run_query() 是运行这些查询的更好方法——语句文档有以下警告:

虽然该语句和 load_result 设置目前有效,但我们打算在未来改进此界面。如果您有任何问题或建议,请在 GitHub 或 Slack 上告诉我们。

【讨论】:

谢谢你,我现在修改了,我得到一个变量无法识别的错误:Unrecognized name: current_snapshot_date 所以问题出在代码的最顶部,我有配置设置,我将 snapshot_date 指定为最终 Select 语句中不存在的集群字段。因此,一方面是我的错,另一方面,日志永远不会将这部分代码指出为错误,它们会更深入地指出我试图排除故障的代码。

以上是关于DBT 模型:如何从查询中创建变量并在 If 语句中使用它的主要内容,如果未能解决你的问题,请参考以下文章

从 if 语句中创建一个全局变量

使用 dbt for-loop 在 BigQuery 中创建多个表

DBT - dbt 部署模型应属于的架构的最佳实践?

如何在 dbt jinja 中将两个表加入字典

Xcode Swift 调试器不会显示在 if 语句中创建的变量

如何在一个查询中创建两个更新语句?