DBT 模型中的 Jinja 函数调用

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

只是想知道,jinja 不会对 dbt sql/model 表中的每一行应用函数吗?

With my_cte AS (
  Select 
    t.id as id, 
    {{my_func('id')}} as amount
  From table t
)

它为 CTE 中每一行的“金额”列返回相同的值。它似乎计算第一行的值并将其用于每一行。这是正常的吗?我假设它会返回与 sql 应用函数相同的结果,每行具有不同的值。

谢谢。

sql jinja2 dbt
1个回答
0
投票

这是正常的

dbt 的工作方式分为两个步骤。

  1. 将模型编译成普通的SQL语句。编译后的sql位于

    target/compiled
    文件夹中。我们可以复制编译好的sql直接在数据仓库环境中运行。这对于调试目的非常有用。

  2. 将编译后的sql发送到

    profiles.yml
    文件中提供的数据仓库目标。

在sql编译时,它是固定的。而固定部分可以是sql函数。然后,数据仓库将逐行评估该 sql 函数。 sql 函数可以是数据仓库的内置函数,也可以是自定义函数,通常通过运行

CREATE FUNCTION
。这是 postgres 的示例。

CREATE FUNCTION add_numbers(a integer, b integer)
RETURNS integer AS $$
BEGIN
    RETURN a + b;
END; $$
LANGUAGE plpgsql;
© www.soinside.com 2019 - 2024. All rights reserved.