问题描述
在阅读某些docs时,我注意到每次调用宏时,我都可以在架构上进行一些元工作。
其中之一是清理架构。
(已根据dbt松弛中的讨论进行了编辑)
-
dbt run-operation freeze
会检查所有将使用dbt run写入但具有自动生成的哈希(可能只是时间戳记)的表。它将以我选择的模式输出这些表,并将“哈希”记录到控制台。 -
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 %}