【问题标题】:DBT macro ignores leading if blockDBT 宏忽略前导 if 块
【发布时间】:2021-10-11 13:14:08
【问题描述】:

我定义了一个以:

开头的宏
{% macro my_macro(table, first=false) %}

{%- if first -%} WITH
{%- else -%} ,
{% endif %}

tmp AS (...

在已编译的 SQL 中,我看到这完全被忽略了。如果我在第一个 CTE 之后粘贴这个完全相同的块,它会很好地插入。如果我在 if-block 之前放置任何文本,它也会呈现 if-block 的文本 + 内容。

我不明白这种行为。如何使这个宏以 WITH 或 "," 开头?

即使我将first 替换为true,它也不会出现。

附加信息: 我正在使用 BigQuery 和 dbt 版本 0.18.2

【问题讨论】:

    标签: jinja2 dbt


    【解决方案1】:

    经过反复试验,我意识到使用“-”来减少第一行的空格会以某种方式删除后面的文本。 所以

    {%- if first -%}
    WITH
    ...
    

    没用,但是

    {% if first %}
    WITH
    ...
    

    没问题。这是一个简单的修复,但我怀疑这是预期的行为。

    【讨论】:

      【解决方案2】:

      有趣的问题!几个问题:

      1. 您使用的是什么数据库?
      2. 您使用的是哪个版本的 dbt?
      3. first 在您的查询中来自哪里?

      在 Azure Synapse 和 dbt 版本 0.18.1 上,我能够成功使用以下内容:

      
      {% set first = true %}
      
      {%- if first -%}
      WITH 
      {%- else -%} , 
      {% endif %}
      
      top_100 AS (
      
          SELECT 100 AS MyNumber
      
      
      ),
      
      top_10 AS (
      
          SELECT TOP 10 * FROM top_100
      
      )
      
      SELECT * FROM top_10
      
      

      【讨论】:

      • 我添加了问题的答案。谢谢大卫!
      • 我找到了原因(见其他答案),但不知道为什么会发生
      • 哇哦,这太奇怪了!如果你能更普遍地重现这一点,我想这将是一个很好的问题。
      猜你喜欢
      • 2011-07-19
      • 2022-01-17
      • 1970-01-01
      • 2021-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      相关资源
      最近更新 更多