dbt宏可以在sql调用中遍历列表中的项目? item_in_list_query get_tables 模型

问题描述

首先,我是dbt支持者!我喜欢这个工具及其多功能性。

在阅读某些docs时,我注意到每次调用宏时,我都可以在架构上进行一些元工作。

其中之一是清理架构。

已根据dbt松弛中的讨论进行了编辑

  1. dbt run-operation freeze会检查所有将使用dbt run写入但具有自动生成的哈希(可能只是时间戳记)的表。它将以我选择的模式输出这些表,并将“哈希”记录到控制台。

  2. dbt run-operation unfreeze --args '{hash: my_hash}',然后将继续查找使用该哈希前缀编写的表,并将其从架构中清除。

解决方法

我已经在较旧版本的dbt中创建了这样的宏,它仍然可以在0.17.1上运行。

There's no longer an option to add Framework assembly references. In keeping with Visual Studio,all .NET Core Framework assemblies are referenced automatically. 下的宏正在从单独的宏item_in_list_query(也在下面)中获取tables的列表。然后,将该表列表连接在get_tables内,以组成所需的SQL查询并执行它。为了演示,还有一个模型,其中使用了item_in_list_query

item_in_list_query

item_in_list_query

get_tables

{% macro item_in_list_query() %}

    {% set tables = get_tables() %}

    {{ log("Tables: " ~ tables,True) }}

    {% set query %}
        select id
        from my_tables
        {% if tables -%}
            where lower(table_name) in {% for t in tables -%} {{ t }} {%- endfor -%}
        {%- endif -%}
    {% endset %}

    {{ log("query: " ~ query,True) }}

    {# run_query returns agate.Table (https://agate.readthedocs.io/en/1.6.1/api/table.html). #}
    {% set results = run_query(query) %}

    {{ log("results: " ~ results,True) }}

    {# execute is a Jinja variable that returns True when dbt is in "execute" mode i.e. True when running dbt run but False during dbt compile. #}
    {% if execute %}
    {# agate.table.rows is agate.MappedSequence in which data that can be accessed either by numeric index or by key. #}
    {% set results_list = results.rows %}
    {% else %}
    {% set results_list = [] %}
    {% endif %}

    {{ log("results_list: " ~ results_list,True) }}
    {{ return(results_list) }}

{% endmacro %}

模型

{% macro get_tables() %}
      {%- set tables = [
          ('table1','table2')
      ] -%}
  {{return(tables )}}
{% endmacro %}