DBT CLI 变量值未作为字符串传递

问题描述 投票:0回答:1

我在项目 YML 中定义了一个

var("run_date")
,将昨天作为日期,使用
dbt_date.yesterday()

如果我在 SQL 中使用它,它就可以正常工作。不过,我使用此设置是为了能够使用 CLI 覆盖该值。 但是当我做类似的事情时

dbt run --select test_model --vars '{run_date: "2023-12-01"}'

它只是作为

2023-12-01
传递,并且 SQL 失败。 我尝试了在命令中使用 ', " 或不使用 ', " 的不同方法,但似乎没有任何效果。

我正在使用以下 SQL 来测试它;

{% set run_date_dash = var("run_date") %}

SELECT REPLACE(SAFE_CAST( {{ run_date_dash }} as STRING), "-","") as test_date

另一个问题中的某人通过简单地在 sql 中添加 '' 解决了他的问题,但这在这里不起作用,因为默认情况下

run_date
是 DATE 类型

有什么建议可以直接解决这个问题,还是我应该构建一些 jinja 条件来检查变量是否被否决或其他什么?

更新: 作为 SELECT,下面的代码似乎可以工作,但可能不是最好的解决方案。我的问题是 var("run_date") 默认情况下是 dbt_date.yesterday(),这只是一个 SQL 语句。如果我是正确的,这不会在宏中执行?所以使用宏不是这里的解决方案。

但是,现在尝试在 WHERE 语句中使用它似乎也有问题,但这可能是另一个问题..

{% set run_date_dash = var("run_date" %}

{% if run_date_dash == dbt_date.yesterday() %}
  SELECT
    1 as test,
    REPLACE(CAST(
      cast(
        datetime_add(
          cast(
            cast(timestamp(datetime(current_timestamp(), 'Europe/Amsterdam')) as date) as datetime
          ),
          interval -1 day
        ) as date
      ) as STRING
    ), "-", "") as test_date
{% else %}
  SELECT
    1 as test,
    REPLACE(CAST('{{ run_date_dash }}' as STRING), "-", "") as test_date
{% endif %}

尝试使用宏,但是

jinja2 dbt
1个回答
0
投票

有几件事需要澄清:

  • dbt_date.yesterday()
    不是 SQL,它是 dbt jinja 宏。必须在内部调用它
    {{ }}
    。感谢使用跨方言宏。
  • 即使您将
  • var
    dbt_project.yml
     中的 
    dbt_date.yesterday()
     中的 
    {{ }}
     永远不会计算,因为 
    var
     只被视为字符串。 (我知道这很烦人。)
  • var
    env_var
     是不同的变量类型。
  • 不要假设
  • var("run_date")
     是日期类型。它是日期格式,但我敢打赌它的类型是字符串。
您想要做的“英语”是“当我通过 dbt CLI 将

run_date

 传递给 dbt 时,然后使用该日期,否则使用昨天的日期。”

实现这一目标的方法是

{{ env_var('run_date', dbt_date.yesterday()) }} ::date

::date
 假设您使用的是支持该转换语法的 SQL 方言。

注意:如果您使用 dbt Cloud,您需要将变量命名为

DBT_run_date

 而不是 
run_date

© www.soinside.com 2019 - 2024. All rights reserved.